2017-04-25 8 views
2

大規模なJava Swingアプリケーションを保守する場合、JFileChooserから派生したサブクラスのファイル名テキストフィールドの矢印キーが機能しないという問題があります。SwingアプリケーションでKeyPressedイベントをどのように消費するのかを調べる方法は?

ちょうどJFrameだけの小さなスタンドアローンのスイングアプリにこのクラスを入れると、矢印キー(特に左右)がファイル名フィールドのカーソルの周りを動くようになりますが、うまくいきません元のアプリケーションで。私はすべてのコンテナのすべてのKeyListenersをチェックしましたが、イベントをキャプチャするものは見つかりませんでした。ですから、問題は、特定のまたはすべてのKeyPressイベントで、IDEをデバッグモード(またはIDEなしで問題をデバッグする方法)で停止する方法はありますか?

答えて

2

私がこれを行う方法は、中にブレークポイントを入れますjava\awt\Component.java。 JDKでそれを見つけることができるはずです。あなたが複数のリスナーを持っている場合

protected void processKeyEvent(KeyEvent e) { 
    KeyListener listener = keyListener; 
    if (listener != null) { 
     int id = e.getID(); 
     switch(id) { 
      case KeyEvent.KEY_TYPED: 
       listener.keyTyped(e); 
       break; 
      case KeyEvent.KEY_PRESSED: 
       listener.keyPressed(e); 
       break; 
      case KeyEvent.KEY_RELEASED: 
       listener.keyReleased(e); 
       break; 
     } 
    } 
} 

この場合KeyListener変数は少し非直感的です:これは、あなたが登録したリスナーにすべてのイベントを送出する方法です。追加された順にリスナーのリストを反復処理すると考えられます。実際には、基本的に単なるリスナーのペアであるAWTEventMulticasterという複合オブジェクトを使用します。

あなたは構造が簡単である2人のリスナーがある場合:

AWTEventMulticaster 
{ 
    first_listener_you_added; 
    second_listener_you_added; 
} 

を次の3人のリスナーを持っている場合は、構造が入れ子になったMulticasterの使用:

AWTEventMulticaster 
{ 
    first_listener_you_added; 
    AWTEventMulticaster 
    { 
     second_listener_you_added; 
     third_listener_you_added; 
    } 
} 

をというように...

この時点からアプリケーションを慎重に追跡することで、イベントが消費されるポイントを見つけることができるはずです。

+0

詳細でわかりやすい答えに感謝します。 – Metaphox

+0

@Metaphox大歓迎です – Michael