28

我正在尝试在JEditorPane. 我用来确定要显示什么工具提示文本的方法是相当 CPU 密集型的 - 所以我只想在鼠标停止一小段时间后才显示它 - 比如 1 秒。

我知道我可以使用ToolTipManager.sharedInstance().setInitialDelay(),但是这会同时为所有摆动组件上的工具提示设置延迟时间,我不希望这样。

4

4 回答 4

33

如果您想要使特定组件的工具提示解除延迟更长,那么这是一个不错的技巧:

(在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);
  }
});
于 2011-06-29T08:44:25.907 回答
7

好吧,我建议在另一个线程上执行 CPU 密集型任务,这样它就不会中断正常的 GUI 任务。

那将是一个更好的解决方案。(而不是试图规避问题)

*编辑*您可以计算每个单词的提示JEditorPane并将它们存储在Map. 然后,您所要做的就是在Map它发生变化时访问tootip。

理想情况下,人们不会同时移动鼠标和打字。因此,您可以在文本更改时计算提示音,然后将它们MapmouseMoved().

于 2009-07-27T19:59:14.170 回答
7

您可以自己显示弹出窗口。监听 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();
}

这会给你带来可调节的延迟和很多麻烦:)

于 2009-07-28T07:01:02.357 回答
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);
  }
}
于 2020-06-11T17:59:24.543 回答