工具提示:如何获得触发提示的鼠标坐标?

时间:2015-02-18 13:52:42

标签: java tooltip javafx-8

要求:显示触发工具提示作为其文本的mouseEvent的坐标。对于contextMenu,该位置存储在contextMenuEvent中,因此我将监听contextMenuRequested并根据需要进行更新。

无法找到任何类似的工具提示,所以玩了一下(见下面的例子):

  • 在显示/显示时,我可以查询工具提示位置:对于AnchorLocation.CONTENT_TOP_LEFT,其x / y似乎是关于最后一个鼠标位置,尽管略有增加。然而,可能是偶然的,未指明(并且因此无法使用)并且对于其他锚类型肯定是关闭的

  • 强力方法是install a mouse-moved handler并将当前鼠标位置存储到工具提示的属性中。不愿意,因为那是重复的功能,因为ToolTipBehaviour已经跟踪了触发位置,不幸的是最常偷偷地,像往常一样

  • 由于行为的私人范围,
  • 扩展工具提示也无济于事

有什么想法吗?

public class DynamicTooltipMouseLocation extends Application {

    protected Button createButton(AnchorLocation location) {
        Tooltip t = new Tooltip("");
        String text = location != null ? location.toString() 
                : t.getAnchorLocation().toString() + " (default)";
        if (location != null) {
            t.setAnchorLocation(location);
        }
        t.setOnShown(e -> {
            // here we get a stable tooltip
            t.textProperty().set("x/y: " + t.getX() + "/" + t.getY() + "\n" +
                    "ax/y: " + t.getAnchorX() + "/" + t.getAnchorY());
        });
        Button button = new Button(text);
        button.setTooltip(t);
        button.setOnContextMenuRequested(e -> {
            LOG.info("context: " + text + "\n      " +
                    "scene/screen/source " + e.getSceneX() + " / " + e.getScreenX() + " / " + e.getX());
        });
        button.setOnMouseMoved(e -> {
            LOG.info("moved: " + text + "\n      " +
            "scene/screen/source " + e.getSceneX() + " / " + e.getScreenX() + " / " + e.getX());
        });
        return button;
    }

    @Override
    public void start(Stage stage) throws Exception {
        VBox pane = new VBox(createButton(AnchorLocation.CONTENT_TOP_LEFT));
        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }

    @SuppressWarnings("unused")
    private static final Logger LOG = Logger
            .getLogger(DynamicTooltipMouseLocation.class.getName());
}

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的问题,但是如果你正在寻找鼠标的屏幕坐标,就在工具提示显示的位置,我想你几乎得到了它们

您已经查看了Tooltip类及其内部类TooltipBehavior

对于初学者来说,有这些硬编码的偏移量:

private static int TOOLTIP_XOFFSET = 10;
private static int TOOLTIP_YOFFSET = 7;

然后,在内部类中,鼠标移动处理程序被添加到节点,在屏幕坐标中跟踪鼠标,并显示基于多个计时器的工具提示:

    t.show(owner, event.getScreenX()+TOOLTIP_XOFFSET,
                            event.getScreenY()+TOOLTIP_YOFFSET);

鉴于它使用了这个show方法:

public void show(Window ownerWindow, double anchorX, double anchorY)

您正在寻找的坐标就是:

coordMouseX=t.getAnchorX()-TOOLTIP_XOFFSET;
coordMouseY=t.getAnchorY()-TOOLTIP_YOFFSET;

无论工具提示锚位置如何设置。

我也在您对question的回答中对此进行了检查,这些值与您在工具提示中设置的Point2D screen相同。

无论如何,由于此解决方案使用来自私有API的硬编码字段,我认为您不会喜欢它,因为这些可能会在没有通知的情况下发生变化......