3

そのため、ユーザーが Swing アプリの任意の場所でスペースバーを押すたびに、イベント (メディアの一時停止/一時停止解除) をトリガーしたいと考えています。

フォーカスできるコントロールとパネルが非常に多いため、それらすべてにキーイベントを追加することは実際には不可能です (グロスは言うまでもありません)。

だから私は見つけた

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

これは素晴らしいことです。グローバルなキープレス プリハンドラーを登録できます。ただし、大きな問題があります。入力フィールドや表のセルなどにスペースが常に入力されるため、一時停止イベントをトリガーしたくないのは明らかです。

アイデアはありますか?おそらく、すべての編集可能なコントロールのリストをチェックすることなく、カーソルがテキスト入力を許可するものにフォーカスされているかどうかをグローバルに検出する方法があります(嘔吐!)?

4

3 に答える 3

2

あなたは自分で答えたと思います-はい、フォーカスのある現在の要素を見つけることができると思います。それが特定のフィールドクラスのインスタンスである場合、一時停止イベントのためにスペースを無視します。手間がかかる場合でも、心配しないでください。instanceof は JVM に対して非常に高速です (そして、何らかの理由で、プロセッサにとっては 1 時間の人間規模のイベントについて話しているためです)。

于 2008-11-05T09:45:29.277 に答える
1

Swing には慣れていませんが、 Toolkit.addAWTEventListenerを使用してグローバル リスナーを登録してみてくださいKEY_EVENT_MASK。その後、タイプとソースに基づいて AWTEvent 処理をフィルタリングできます。

于 2008-11-05T18:29:25.210 に答える
0

わかりました...ソースに基づいてフィルタリングしようとしています。問題は編集可能な ComboBoxes です...それらは instanceof です

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField

そして、BorderlessTextField はプライベートな内部クラスであるため、それに対して instanceof チェックを実行できないようです。

アイデア?

編集:わかりましたので、これは機能します....

 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() {

            public boolean postProcessKeyEvent(KeyEvent e) {
                if (e.getID() == KeyEvent.KEY_PRESSED) {
                    Object s = e.getComponent();
                    if (!(s instanceof JTextField) &&
                        !(s instanceof JTable && ((JTable) s).isEditing())
                        ) {
                        music_player.pauseEvent();
                    }

                    //System.out.println(s.getClass().toString());
                }
                return true;
            }
        });

それは完全にグロスで、私はそれが嫌いです。キープレスがコンポーネントによって消費されたかどうかを確認する方法を見つけられたらいいのにと思います-その後、キープレスがどのコンポーネントによってもアクションされなかったときにのみ一時停止イベントを実行できました。

于 2008-11-05T22:52:17.317 に答える