java - Javafx 自定义工具提示实现仅在安装的最后一个节点上显示
问题描述
我正在尝试创建自己的工具提示实现,它有一个箭头并在它安装的节点的某一侧显示工具提示。它看起来像这样:
这是我到目前为止编码的内容
工具提示.java
public class Tooltip extends PopupControl {
private StringProperty message = new SimpleStringProperty();
private final static TooltipSkin skin = new TooltipSkin();
private final static TooltipBehavior behavior = new TooltipBehavior();
public Tooltip(Node node, String message) {
this.message.setValue(message);
if (getContent() != skin.createSkin()) {
getContent().setAll(skin.createSkin());
}
behavior.install(node, Tooltip.this);
}
/****************************************************************
********** ACCESSORS ************
****************************************************************/
String getMessage() {
return message.get();
}
StringProperty messageProperty() {
return message;
}
private static class TooltipBehavior {
final String TOOLTIP_PROP_KEY = "fxtooltip";
private void install(Node node, Tooltip tooltip) {
if (node == null)
return;
node.addEventHandler(MouseEvent.MOUSE_ENTERED, ENTERED_HANDLER);
node.addEventHandler(MouseEvent.MOUSE_EXITED, KILL_HANDLER);
node.addEventHandler(MouseEvent.MOUSE_PRESSED, KILL_HANDLER);
node.getProperties().put(TOOLTIP_PROP_KEY, tooltip);
}
private EventHandler<MouseEvent> ENTERED_HANDLER = (MouseEvent event) -> {
Node hoveredNode = (Node) event.getSource();
Tooltip tooltip = ((Tooltip) hoveredNode.getProperties().get(TOOLTIP_PROP_KEY));
String message = tooltip.getMessage();
skin.setMessage(message);
tooltip.show(getWindow(hoveredNode), 0, 0);
};
private EventHandler<MouseEvent> KILL_HANDLER = (MouseEvent event) -> {
Node hoveredNode = (Node) event.getSource();
Tooltip tooltip = ((Tooltip) hoveredNode.getProperties().get(TOOLTIP_PROP_KEY));
tooltip.hide();
};
private Window getWindow(final Node node) {
final Scene scene = node == null ? null : node.getScene();
return scene == null ? null : scene.getWindow();
}
}
private static class TooltipSkin {
private static HBox $RootView = new HBox();
private static StackPane $PaneMessageBody = new StackPane();
private static StackPane $PaneArrow = new StackPane();
private static Text $TextMessage = new Text();
private static boolean skinInitialized = false;
Pane createSkin() {
if (skinInitialized) {
return $RootView;
} else {
skinInitialized = true;
$RootView.getChildren().addAll($PaneMessageBody, $PaneArrow);
$PaneMessageBody.getChildren().addAll($TextMessage);
}
return $RootView;
}
void setMessage(String message) {
$TextMessage.setText(message);
}
}
}
在我的控制器中,我有一些按钮,我以这种方式添加了工具提示
new Tooltip($BtnDownload, "Download");
new Tooltip($BtnActivate, "Activate");
但是,这仅适用于安装工具提示的最后一个节点,如果我将鼠标悬停在具有工具提示的其他节点上,光标开始闪烁,并且工具提示根本不显示。这可能是什么问题?
解决方案
推荐阅读
- swift - 导航栏不可见 swift
- javascript - 如何解决 Laravel 6 中的“当前未启用对实验语法 'classProperties' 的支持”?
- sql - SQL Server 连接查询 - 需要帮助
- haskell - 当我尝试混合地板、除法和加法时,为什么 Haskell 会抱怨?
- python - 在 XML 中插入父元素不会保留其父元素(Python)
- css - 是否可以检查 SCSS 元素是否为空?
- loops - 错过空数据
- sql - 为什么两个字符串可以比较相等?
- oracle - 使用 TO_CHAR 将时间戳列转换为 char 时获得不同的年份
- python - 正则表达式。使用 Python 从路径字符串中分组前和姓