要求:显示触发工具提示作为其文本的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());
}
答案 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的硬编码字段,我认为您不会喜欢它,因为这些可能会在没有通知的情况下发生变化......