简体   繁体   English

如何使工具提示对鼠标事件透明?

[英]How to make a Tooltip transparent to mouse events?

A javafx.scene.Node has the ability to make it transparent to mouse events, so that it won't be selected as target for such events: javafx.scene.Node能够使其对鼠标事件透明,因此不会将其选为此类事件的目标:

Node.mouseTransparentProperty() Node.mouseTransparentProperty()
If true, this node (together with all its children) is completely transparent to mouse events. 如果为true,则此节点(及其所有子节点)对鼠标事件完全透明。 When choosing target for mouse event, nodes with mouseTransparent set to true and their subtrees won't be taken into account. 选择鼠标事件的目标时,将mouseTransparent设置为true的节点及其子树将不予考虑。

Unfortunately this features is not yet implemented for javafx.scene.control.Tooltip . 不幸的是, javafx.scene.control.Tooltip尚未实现此功能。
There is an open feature request for that - but there doesn't seem to be a lot of activity on that topic. 有一个开放的功能请求 - 但似乎没有很多关于该主题的活动。

My question is: Is there any workaround for this? 我的问题是:这有什么解决方法吗? How can I make a Tooltip mouse-transparent to route mouse events to the underlying control? 如何将鼠标事件的工具提示透明化以将鼠标事件路由到基础控件?

If someone is still looking for a solution. 如果有人仍在寻找解决方案。 I found a hacky way in javafx-8 (using internal API!!). 我在javafx-8中找到了一种hacky方式(使用内部API !!)。 Its propably patched in javafx-8+, so from a maintainablility standpoint not a good option, but at least something: 它可以在javafx-8 +中进行修补,因此从可维护性的角度来看,这不是一个好的选择,但至少是:

    public static boolean correctNativeMouseEvent(MouseEvent event, Scene exclude)
    {
        Scene targetScene = getTargetScreen(event, exclude);
        if(targetScene != null)
        {
            PickResultChooser chooser = new PickResultChooser();

            targetScene.getRoot().impl_pickNode(new PickRay(event.getScreenX() - targetScene.getWindow().getX() - targetScene.getX(),
                    event.getScreenY() - targetScene.getWindow().getY() - targetScene.getY(),
                    1, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY), chooser);

            PickResult res = chooser.toPickResult();
            if(res != null)
            {
                Point2D pos = res.getIntersectedNode().localToScene(res.getIntersectedPoint().getX(), res.getIntersectedPoint().getY());

                MouseEvent newEvent = new MouseEvent(null, null, event.getEventType(), pos.getX(), pos.getY(),
                        event.getScreenX(), event.getScreenY(),
                        event.getButton(), event.getClickCount(),
                        event.isShiftDown(), event.isControlDown(), event.isAltDown(), event.isMetaDown(),
                        event.isPrimaryButtonDown(), event.isMiddleButtonDown(), event.isSecondaryButtonDown(),
                        event.isSynthesized(), event.isPopupTrigger(), event.isStillSincePress(), res);

                targetScene.impl_processMouseEvent(newEvent);
                return true;
            }
        }
        return false;
    }

    static Scene getTargetScreen(MouseEvent event, Scene exclude)
    {
        double x = event.getScreenX();
        double y = event.getScreenY();

        double sx, sy, sw, sh;

        Iterator<Window> itr = Window.impl_getWindows();

        if(itr.hasNext())
        {
            for(Window w = itr.next(); itr.hasNext(); w = itr.next())
            {
                sx = w.getX();
                sy = w.getY();
                sw = w.getWidth();
                sh = w.getHeight();

                if(sx < x && x < sx + sw
                        && sy < y && y < sy + sh
                        && w.getScene() != exclude)
                    return w.getScene();
            }
        }
        return null;
    }

upon creating a tooltip you just add the following: 在创建工具提示时,您只需添加以下内容:

Tooltip tp = new Tooltip();
// use filter to catch before anything can be consumed
tp.addEventFilter(MouseEvent.ANY, E -> {
    // now correct the event
    correctNativeMouseEvent(E, tp.getScene());
    // although it is optionally, I would recommend to just consume the event anyways
    E.consume();
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM