我正在尝试在JEditorPane
上设置工具提示。我用来确定要显示的工具提示文本的方法是CPU密集型的 - 因此我只想在鼠标停止一段时间后显示它 - 比如1秒。
我知道我可以使用ToolTipManager.sharedInstance().setInitialDelay()
,但这会立即设置所有swing组件上工具提示的延迟时间,我不希望这样。
答案 0 :(得分:28)
如果你想要的是让工具提示解决特定组件的延迟时间更长,那么这是一个很好的黑客:
(http://tech.chitgoks.com/2010/05/31/disable-tooltip-delay-in-java-swing/对技术的赞誉)
private final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay();
addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent me) {
ToolTipManager.sharedInstance().setDismissDelay(60000);
}
public void mouseExited(MouseEvent me) {
ToolTipManager.sharedInstance().setDismissDelay(defaultDismissTimeout);
}
});
答案 1 :(得分:7)
好吧,我建议在另一个线程上执行CPU密集型任务,这样就不会中断正常的GUI任务。
这将是一个更好的解决方案。 (而不是试图规避问题)
*编辑* 您可以计算JEditorPane
中每个字词的tootips并将其存储在Map
中。然后,如果它发生变化,您只需要访问Map
中的tootip。
理想情况下,人们不会同时移动鼠标和打字。因此,您可以在文字发生变化时计算出tootlips,只需从Map
上的mouseMoved()
中提取它们。
答案 2 :(得分:4)
您可以自己显示弹出窗口。侦听mouseMoved()事件,启动/停止计时器,然后使用以下代码显示弹出窗口:
首先你需要PopupFactory,Popup和ToolTip:
private PopupFactory popupFactory = PopupFactory.getSharedInstance();
private Popup popup;
private JToolTip toolTip = jEditorPane.createToolTip();
然后,显示或隐藏工具提示:
private void showToolTip(MouseEvent e) {
toolTip.setTipText(...);
int x = e.getXOnScreen();
int y = e.getYOnScreen();
popup = popupFactory.getPopup(jEditorPane, toolTip, x, y);
popup.show();
}
private void hideToolTip() {
if (popup != null)
popup.hide();
}
这会给你可调节的延迟和很多麻烦:)
答案 3 :(得分:0)
FWIW,这是基于Noel帖子的代码。它采用了现有技术,并将其包装到一个新类中,该类中的默认值是静态存储的。以防万一任何人都可以受益:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
/**
* Provides customizable tooltip timeouts for a {@link javax.swing.JComponent}.
*
* @see ToolTipManager#setDismissDelay(int).
*/
public final class CustomTooltipDelayer extends MouseAdapter
{
private static final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay();
private final int _delay;
/**
* Override the tooltip timeout for the given component in raw millis.
*
* @param component target
* @param delay the timeout duration in milliseconds
*/
public static CustomTooltipDelayer attach(JComponent component, int delay)
{
CustomTooltipDelayer delayer = new CustomTooltipDelayer(delay);
component.addMouseListener( delayer );
return delayer;
}
/**
* Override the tooltip timeout for the given component as a ratio of the JVM-wide default.
*
* @param component target
* @param ratio the timeout duration as a ratio of the default
*/
public static CustomTooltipDelayer attach(JComponent component, float ratio)
{
return attach( component, (int)(defaultDismissTimeout * ratio) );
}
/** Use factory method {@link #attach(JComponent, int)} */
private CustomTooltipDelayer(int delay)
{
_delay = delay;
}
@Override
public void mouseEntered( MouseEvent e )
{
ToolTipManager.sharedInstance().setDismissDelay(_delay);
}
@Override
public void mouseExited( MouseEvent e )
{
ToolTipManager.sharedInstance().setDismissDelay(defaultDismissTimeout);
}
}