我正在使用(旧式)Java-Swing应用程序,但遇到了一个问题:

此应用程序中的主要GUI组件是甘特图,基本上将任务显示为带有标签的矩形。
右键单击任务会打开一个上下文菜单,同时用鼠标悬停在任务上会显示一个自定义的可滚动JTooltip。这个星座导致我的问题。

如果我将工具提示放置在与当前鼠标位置相距太远的位置,则工具提示会消失,然后才能将鼠标移至滚动条手柄之一(水平/垂直)。
如果我将工具提示放置在离当前鼠标位置太近的位置,则上下文菜单将不再打开,因为工具提示隐藏了基础任务,因此右键单击是由工具提示而不是任务捕获的。

到目前为止,我已经尝试过:


在ToolTipManager中搜索某种延迟,以控制显示工具提示的时间,鼠标离开控件后,触发显示工具提示。据我所知,没有这样的延迟属性。
试图找到工具提示和当前鼠标位置之间的正确距离,以便可以到达工具提示的滚动条手柄,并且还显示了上下文菜单。 ->我发现有一段距离,两者都可行,但是通常您必须尝试几次,直到可以到达滚动条手柄为止。


所以我的问题是:
有什么方法可以控制鼠标离开相应组件后何时隐藏JToolTip?

最佳答案

创建具有正确模态的JWindow,更好的未修饰JDialog(然后可能最容易捕获MouseEvents)
通过仅切换setVisible false / true仅使具有setDefaultCloseOperation-DO_NOTHING_ON_CLOSE or HIDE_ON_CLOSE的一个窗口重用此容器以用于整个JVM实例,请在setVisible(false)之前清除窗口内容
通过测试Swing TimerSwingTimer.isRunning放在(例如)5-10秒进行逻辑自动关闭,如果继续进行鼠标滚动并且SwingTimer.isRunning返回true,则调用SwingTimer.restart
为整个JVM实例覆盖mouseClicked例如

if (window.isVisible)
    window.getContentPane.removeAll()
    window.setVisible(false)
else
    someThingWithRealEventFromMouseListener

可以使用some of better Listener that returns Boolean value代替使用MouseListener的低级实例
您可以使用SwingUtilities中的2-3种方法来(re)dispatch()鼠标滚动(仅在当前父级的边界内-JFrameJDialog)到弹出窗口。

10-05 17:55