提示:如何让触发尖端鼠标坐标?(Tooltip: how to get mouse coordina

2019-10-21 22:49发布

要求:显示的MouseEvent的触发提示作为其文本的坐标。 对于一个ContextMenu,位置存储在的ContextMenuEvent,所以需要我会听contextMenuRequested和更新。

找不到一个提示了类似的话,所以起到了位(见下面的例子):

  • 在显示/显示的时间,我可以查询工具提示的位置:对于AnchorLocation.CONTENT_TOP_LEFT其X / Y似乎是对过去的鼠标位置,虽然略有增加。 可能是偶然的,虽然是对其他类型的锚未指定(并且因此无法使用)和绝对关

  • 蛮力的方法是安装一个鼠标移动处理程序和当前鼠标位置存储到提示的属性。 会不会喜欢,因为这是复制的功能,如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());
}

Answer 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;

无论怎样的提示锚位置设置。

我在你的答案也查了这个问题 ,并且这些值是相同Point2D screen设置为提示。

无论如何,因为该解决方案使用私人API硬编码的领域,我想你不会喜欢它,因为那些可以改变,恕不另行通知...



文章来源: Tooltip: how to get mouse coordinates that triggered the tip?