java - 扩展 Swing 的 ToolTipManager 以更改悬停时的行为?

标签 java swing user-interface tooltip custom-component

我想在 Swing 中实现一个具有自定义行为的工具提示:用户悬停在组件上的时间越长,工具提示中应显示的详细信息就越多(即,几秒钟后添加几行新行)用户悬停在组件上)。我只需要检查这是否真的适用于 Swing 而不会变得太乱。我现在的想法可能是:

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

这样的事情是否可行,或者这不是使用 Swing 的好方法(抱歉,我对它还很陌生)?有更好的方法吗?

[edit] 嗯,记得 ToolTipManager 是一个单例,其构造函数仅具有包可见性,因此无法扩展。

[edit 2] 目前我正在尝试一些解决方案。我忘记添加的一件事是我确实需要知道哪个组件正在悬停 - 我想这意味着我需要使用某种带有 mouseEntered() 方法的监听器(或者能够访问它信息)。不需要与弹出窗口/工具提示进行其他交互 - 它只需要显示信息。

最佳答案

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

的操作
while(true)
{
    sleep(1);
    timeElapsed++;
}

在扩展 ToolTipManager 的类中,为扩展 Thread 的类创建一个字段,并在 mouseEntered(MouseEvent e) 实例化像这样的东西:

extendsThreadClass = new ExtendsThreadClass();
extendsThreadClass.start();

然后在 mouseExited(MouseEvent e) 方法中执行

extendsThreadClass = null;

然后在 mouseEntered(MouseEvent e) 方法中启动 Thread 然后你可以在时间之后做你想做的事情,比如

if(timeElapsed > 3000)
{
   //what you want to do here
}

抱歉,这可能会造成混淆,如果我可以为您解决问题,请告诉我

关于java - 扩展 Swing 的 ToolTipManager 以更改悬停时的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30368649/

相关文章:

java - 读取 .tsv 文件时跳过备用行

java - 在 Swing 应用程序框架 jsr 296 中设置不同的外观

java - 当 JEditorPane 不会做。 JRex,JRex 为什么你是 JRex?

java - Java SE 6 中的 JPA/Hibernate,数据访问的最佳实践

java - Spring CrudRepository-如何通过外键 ID 插入记录?

Xmonad 中不显示 Java Swing GUI

ruby - 如何安装 Ruby Shoes?

java - 如何在我的 Java 游戏中正确实现 JScrollPane GUI?

java - Box2D - 不能破坏多个固定装置

java - 间隔后在 Swing JComponent 中重新绘制