1

ユーザーに表示される設定のポップアップがあります。外側をクリックすると非表示になりますが、内側をクリックすると表示されたままになります。

この動作を処理するイベント ハンドラーはComponent(クリックされた) を取得し、component.getParent()再帰的に使用することで、設定パネルの子であるかどうかを確認できます。これはこれまでのところうまくいきました。

しかし、JComboBoxそのパネルに を追加したところ、「選択可能な項目のポップアップ」(名前はありますか?) をクリックしたときに表示されるコンボボックスがコンボボックスの子ではないことがわかりました。コンボボックスで何かを選択しようとすると、設定パネルが非表示になります。

NetBeans デバッガーを使用すると、そのタイプBasicComboPopup$1(匿名クラスですか?) を確認できますが、どちらのインスタンスComboPopupJPopupMenuBasicComboPopup.

クリックされた「コンボボックスポップアップ」の所有者/親コンボボックスを識別する方法が必要です。

4

2 に答える 2

5

完全にはわかりませんが、探しているかもしれません

 popup.getInvoker();

これは、呼び出し元のコンボ ボックスを返します。

以下のユーティリティ メソッド (SwingX フレームワークに付属する SwingXUtilities からコピー): イベントのソース コンポーネント (メソッド内の残念な名前は focusOwner です ;-) が見つかった場合、そのソースがポップアップを含めて親の下のどこかにあるかどうかをチェックします。 .

親がポップアップであることに気付いたので、ロジックを少し調整して、最初と 2 番目の if ブロックを切り替える必要があります (試していませんでしたが、複数のポップアップが表示されるのは珍しいことです。:-)

/**
 * Returns whether the component is part of the parent's
 * container hierarchy. If a parent in the chain is of type 
 * JPopupMenu, the parent chain of its invoker is walked.
 * 
 * @param focusOwner
 * @param parent
 * @return true if the component is contained under the parent's 
 *    hierarchy, coping with JPopupMenus.
 */
public static boolean isDescendingFrom(Component focusOwner, Component parent) {
    while (focusOwner !=  null) {
        if (focusOwner instanceof JPopupMenu) {
            focusOwner = ((JPopupMenu) focusOwner).getInvoker();
            if (focusOwner == null) {
                return false;
            }
        }
        if (focusOwner == parent) {
            return true;
        }
        focusOwner = focusOwner.getParent();
    }
    return false;
}
于 2012-08-24T12:18:23.327 に答える
1
  1. あなたが話しているかどうかわからない

    • mouseイベント

    • keyboardイベント

    • mousekeyboardイベント

  2. SwingUtilitiesを見て、 childvsのメソッドparentとその逆のメソッドがあります。

  3. から抽出して変更する方法がいくつかあるため、目的のイベントに関する詳細な説明を含むSSCCEPopupを投稿しますJComboBox

編集

コンポーネントを使用AWT Popupまたは混合Swing lightweightする場合は、Darryl による Swing Utilsを参照する必要があります。AWT heavyweight

于 2012-08-24T11:51:56.210 に答える