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

ポップアップを自分で表示できます。mouseMoved() イベントをリッスンし、タイマーを開始/停止してから、次のコードでポップアップを表示します。

まず、PopupFactory、Popup、および ToolTip が必要です。

private PopupFactory popupFactory = PopupFactory.getSharedInstance();
private Popup popup;
private JToolTip toolTip = jEditorPane.createToolTip();

次に、toolTip を表示または非表示にします。

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 に答える
7

通常の GUI タスクを中断しないように、CPU を集中的に使用するタスクを別のスレッドで実行することをお勧めします。

それはより良い解決策でしょう。(問題を回避しようとするのではなく)

*編集*内のすべての単語のヒントを計算して、JEditorPaneに保存することもできMapます。次に、変更された場合にツールチップにアクセスするだけですMap

理想的には、ユーザーがマウスを動かしながら同時に入力することはありません。したがって、テキストが変更されたときにツールリップを計算し、Maponから引き出すだけmouseMoved()です。

于 2009-07-27T19:59:14.170 に答える
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 に答える