2009-07-27 7 views
23

JEditorPaneにツールチップを設定しようとしています。どのツールヒントテキストを表示するかを決定するために使用する方法は、かなりCPUを大量に消費するので、短い時間(例えば1秒)マウスが停止した後にしか表示しません。Java Swingで特定のコンポーネントのツールチップの遅延時間を設定する

私はToolTipManager.sharedInstance().setInitialDelay()を使用することができますが、これはすべてのスイングコンポーネントのツールチップの遅延時間を一度に設定するため、これは望ましくありません。

+0

あなたは、バックグラウンドスレッドで計算することができないツールチップに現在何をしますか? – akarnokd

+0

いくつかのサンプルコードが役に立ちます。おそらく、私が話していることの例を挙げることができます。 – jjnguy

+0

私は、ユーザーがどんな言葉をホバリングしているかに応じて、ツールチップの内容を変更したいと思います。ツールチップの内容を取り込む作業は非常にコストがかかるので、ユーザーが単語を停止した場合にのみ、その計算を実行します。 – Scottm

答えて

6

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

これは優れた解決策です。あなたはおそらくJEditorPaneにすべての単語のためのtootipsを計算し、Mapでそれらを格納することができ編集* *

を(代わりに、問題を回避しようとしているの)。それが変更されたらMapのtootipにアクセスするだけです。

理想的には、マウスを移動して同時に入力することはありません。したがって、テキストが変更されたときにトゥールチップを計算し、のMapからプルダウンします。

+0

あなたの編集は非常に良い提案です。私はそれが実際には私が取り組んでいるデバッガであるため、マップに入れられている値が変更される可能性があるので、それがうまくいくかどうかはわかりません。私はあなたのスレッドの価値を計算するあなたの提案も良いと思う。 – Scottm

+0

はい私は同意します - ユーザーが停止したときにマウスが動いてそれを取り出すときの答えをキャッシュする何らかの形で、私の問題を解決できるでしょう。私はそれを明日試してみましょう - 私はあなたの答えを受け入れるように設定します。ご協力いただきありがとうございます。 – Scottm

3

自分でポップアップを表示できます。あなたがPopupFactory、ポップアップ、およびツールヒントを必要と

まず:

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

、その後、ツールチップを表示または非表示にするタイマーを停止し、次のコードでのポップアップを表示/起動、のmouseMoved()イベントをリッスン:何がしたいことは、ツールチップは、特定のためにはるかに長い遅延を却下することです場合

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(); 
} 

これはあなたに調整可能な遅延やトラブルの多く:)

+0

私の場合、ステータスバーの先頭にあるアイコンの上にカーソルを置くと、ツールチップに過去の「n」というメッセージがポップアップ表示されます。マウスをツールチップ境界内に置いておく限り、それはそのままです。しかし、私は、グローバルなツールチップのタイミングを変更することなく、すべてのタイミングの側面を制御したいと思っていました。 私の意見では、あなたのソリューションは受け入れられた答えよりはるかに優れた選択肢のように思えますが、ちょっとだけ私の2セントですか? このソリューションをお寄せいただきありがとうございますPiligrim、私はすぐにそれを試してみましょう! – Jeach

+0

私は長い間このスレッドを見ていないが、私はあなたの提案が好きです。私はこのプロジェクトを終了する機会を得られなかったので、もう一度これを試してみます。私はあなたのアイデアショットを与えるだろう:) – Scottm

23

を与えますコンポーネント、そしてこれは素敵なハックです:

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); 
    } 
}); 
+0

+1、しかし私は変更を加えた。デフォルトのタイムアウトを 'mouseEntered()'の外で取得しました。なぜなら、defaultDismissTimeoutを複数回設定していると、何か問題が起こる可能性があるからです(タイムアウトを変更した複数のコンポーネントが並んでいる場合はどうでしょうか?理想的には、defaultDismissTimeoutはアプリケーション全体の初期化時に一度しか設定されないように、ある程度グローバルにする必要があります。 – ArtOfWarfare

+0

@ArtOfWarfare、リンクされたブログでは、defaultDismissTimeoutがfinalとマークされていました。 –

+0

@BuhBuh - リスナーの外でdefaultDismissTimeoutを取るためにここで答えを編集しましたが、この回答に基づいて書いた実際のコードでは、コンポーネントの静的な最終変数にすることにしました。デフォルト値である実際の値を確認したい場合は、85〜91行目を参照してください:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6- b14/javax/swing/ToolTipManager.java – ArtOfWarfare

関連する問題