扩展Swing的ToolTipManager以改变悬停时的行为?

fal*_*ure 6 java user-interface swing tooltip custom-component

我想在Swing中实现具有自定义行为的工具提示:用户在组件上悬停的时间越长,工具提示中应显示的细节越多(即,在用户悬停几秒钟后添加一些新行)在组件上).我只需要检查这是否真的可以使用Swing而不会让事情变得太乱.我此刻的想法可能是:

  • 扩展ToolTipManager
  • 覆盖mouseEntered以启动计时器(也许使用javax.swing.Timer?).调用setToolTipText和createToolTip刷新工具提示并定期添加新信息
  • 覆盖mouseExited以重置计时器
  • 可能使用setDismissDelay将解除延迟设置为更长的时间(或Integer.MAX_VALUE)

这样的事情是否可行或者这不是与Swing合作的好方法(对不起,我对它很新)?有没有更好的方法呢?

[编辑]嗯,刚才记得ToolTipManager是一个单例,其构造函数只有包可见性,因此无法扩展.

[编辑2]我正在尝试一些解决方案.我忘记添加的一件事是我确实需要知道哪个组件正在盘旋 - 我想这意味着我需要使用mouseEntered()方法处理某种类型的侦听器(或者能够访问它信息).并且不需要与弹出/工具提示的其他交互 - 它只需要显示信息.

小智 1

(这可能看起来有点令人困惑,所以如果您需要我澄清,请告诉我,我会尽力向您展示我如何描绘代码)我认为您的想法可能会像您扩展它一样工作,并且还制作一个扩展的私有类Thread,然后在run()方法中执行类似的操作

while(true)
{
    sleep(1);
    timeElapsed++;
}
Run Code Online (Sandbox Code Playgroud)

在您的扩展类中ToolTipManager,为该扩展类创建一个字段Thread,并实例mouseEntered(MouseEvent e)化如下内容:

extendsThreadClass = new ExtendsThreadClass();
extendsThreadClass.start();
Run Code Online (Sandbox Code Playgroud)

然后在mouseExited(MouseEvent e)方法中做

extendsThreadClass = null;

然后在mouseEntered(MouseEvent e)开始之后的方法中Thread ,您可以在时间之后做您想做的事情,例如

if(timeElapsed > 3000)
{
   //what you want to do here
}
Run Code Online (Sandbox Code Playgroud)

抱歉,这可能会让您感到困惑,请告诉我是否可以为您解答