我希望在Swing中实现具有自定义行为的工具提示:用户在组件上悬停的时间越长,工具提示中应显示的细节越多(即,在几个之后添加一些新行)用户将鼠标悬停在组件上的秒数。我只需要检查这是否真的可以使用Swing而不会让事情变得太乱。我现在的想法可能是:
这样的事情是否可行,或者这不是与Swing合作的好方法(对不起,我对它很新)?有没有更好的方法呢?
[编辑]嗯,刚才记得ToolTipManager是一个单例,其构造函数只有包可见性,因此无法扩展。
[编辑2]我现在正在尝试一些解决方案。我忘记添加的一件事是我确实需要知道哪个组件正在盘旋 - 我猜这意味着我需要使用mouseEntered()方法处理某种类型的侦听器(或者能够访问此信息)。并且不需要与弹出/工具提示的其他交互 - 它只需要显示信息。
答案 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,但这可能仍然是对某人有帮助)。这就是我所做的:
有点不合时宜,检测鼠标移动到树节点上的时间如下:
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()
中,我重置了工具提示和计时器。
我遇到弹出窗口或工具提示没有调整大小以适应内容的问题,但是看起来没问题。