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

时间:2015-05-21 08:42:23

标签: java swing user-interface tooltip custom-component

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

(这可能看起来有点令人困惑,所以请告诉我,如果你需要我澄清让我知道,我会试着告诉你我如何描绘代码)我认为你的想法可能会像你扩展它一样工作,并且还创建一个扩展Thread的私有类,然后在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
}

很抱歉,这可能令人困惑,如果我能为你清理,请告诉我

答案 1 :(得分:0)

我认为我应该在看到l1zZY的答案之前用我采用的方法更新这个(我认为这是更好的做事方式 - 在我转移到别的东西之前我的代码中仍然有bug,但这可能仍然是对某人有帮助)。这就是我所做的:

  • 扩展JToolTip
  • 使用Swing Timer进行计时
  • 将一个MouseMotion监听器添加到JTree(在我的情况下,我希望弹出窗口显示节点何时悬停)
  • 有点不合时宜,检测鼠标移动到树节点上的时间如下:

    public void mouseMoved(MouseEvent e) {
    int x = (int) e.getX();
    int y = (int) e.getY();
    TreePath path = getPathForLocation(x, y);
    if (path == null) {
        tooltip.hide();
    } else {
        TreeNode node = (TreeNode) path.getLastPathComponent();
        tooltip.setHoveredNode(node); 
        if (!tooltip.isVisible) {
            int absX = e.getXOnScreen();
            int absY = e.getYOnScreen();
            final Popup tooltipContainer = PopupFactory.getSharedInstance().getPopup(PDTreeView.this, 
                    tooltip, absX, absY);
            tooltip.setToolTipContainer(tooltipContainer);
            tooltip.show();
        }
    }
    

    }

  • tooltip.show()指的是工具提示如何包含在Popup中 以编程方式显示或隐藏它。 show()显示了 弹出(以及工具提示)并启动Swing计时器。

  • Timer有一个名为actionPerformed()的方法,可以在您设置的任何时间间隔调用。我只是用该方法调用将新信息添加到工具提示的代码。在hide()中,我重置了工具提示和计时器。

我遇到弹出窗口或工具提示没有调整大小以适应内容的问题,但是看起来没问题。