アクティブなツールチップがあるかどうかSwingで教えてもらえますか?

StackOverflow https://stackoverflow.com/questions/331488

  •  11-07-2019
  •  | 
  •  

質問

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

カスタムツールチップを使用しているので、 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;
    }
}
役に立ちましたか?

解決

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

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

おそらく、nullなどの健全性チェックを実行する必要があります。しかし、これにより、かなり近くになります。

編集、回答:

いくつかのいリフレクションコードの短い、私はあなたに多くの選択肢があるとは思わない。パッケージプライベートコンストラクターのため ToolTipManager をサブクラス化することはできません。また、 showTipWindow()および hideTipWindow()もパッケージプライベートであるため、アダプターパターン同様に出ています。

他のヒント

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

それは残念です。内部議論の後、「quotい反省」私たちも思いついたものでしたが、誰かがもっと良いアイデアを持っていることを望んでいました。

すでに独自の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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top