5

フレームに現在表示されているツールチップがあるかどうかを確認するエレガントな方法はありますか?

カスタム ツールチップを使用しているため、メソッドにフラグを設定するのは非常に簡単createToolTip()ですが、ツールチップがいつなくなったかを確認する方法がわかりません。

ToolTipManagerこれにはtipShowingという素晴らしいフラグがありますが、もちろんそれはprivateあり、それに到達する方法を提供していないようです。 hideWindow()ツールチップコンポーネントを呼び出さないため(私にはわかります)、そこに方法がありません。

誰にも良いアイデアはありますか?

更新:私は反射に行きました。ここでコードを見ることができます:

private boolean isToolTipVisible() {
    // Going to do some nasty reflection to get at this private field.  Don't try this at home!
    ToolTipManager ttManager = ToolTipManager.sharedInstance();
    try {
        Field f = ttManager.getClass().getDeclaredField("tipShowing");
        f.setAccessible(true);

        boolean tipShowing = f.getBoolean(ttManager);

        return tipShowing;

    } catch (Exception e) {
        // We'll keep silent about this for now, but obviously we don't want to hit this
        // e.printStackTrace();
        return false;
    }
}
4

4 に答える 4

4

hideTipAction の isEnabled() プロパティは、tipShowing ブール値に直接関連付けられているようです。これを試すことができます:

public boolean isTooltipShowing(JComponent component) {
    AbstractAction hideTipAction = (AbstractAction) component.getActionMap().get("hideTip");
    return hideTipAction.isEnabled();
 }

おそらく、null などの健全性チェックを行いたいと思うでしょう。しかし、これでかなり近くなるはずです。

編集、あなたの応答に:

いくつかの醜いリフレクション コードを除けば、選択肢はあまりないと思います。ToolTipManagerパッケージ プライベート コンストラクターが原因でサブクラス化できず、showTipWindow()hideTipWindow()もパッケージ プライベートであるため、アダプター パターンもアウトです。

于 2008-12-01T17:19:55.133 に答える
1

すでに独自の createToolTip() を持っているので、次のようなことを試すことができます :)

public JToolTip createToolTip() {
  JToolTip tip = super.createToolTip();
  tip.addAncestorListener( new AncestorListener() {
    public void ancestorAdded( AncestorEvent event ) {
      System.out.println( "I'm Visible!..." );
    }

    public void ancestorRemoved( AncestorEvent event ) {
      System.out.println( "...now I'm not." );
    }

    public void ancestorMoved( AncestorEvent event ) { 
      // ignore
    }
  } );
  return tip;
}
于 2008-12-01T21:19:58.457 に答える
1

それは残念です。社内での話し合いの結果、「醜い反省」も思いつきましたが、他の誰かがより良いアイデアを持っていることを願っていました.

于 2008-12-01T20:27:18.187 に答える
1

ツールチップがあるかどうかを確認するには、すべてのコンポーネントをループする必要があるようです。私はグローバルな価値を探しています。ループは実行可能かもしれませんが、効率が悪いようです。

于 2008-12-01T17:35:42.933 に答える