2017-04-25 46 views
2

因此,在維護大型Java Swing應用程序時,我遇到了一個問題:從JFileChooser派生的子類的文件名文本字段中的箭頭鍵不起作用。如何找出在Swing應用程序中消耗KeyPressed事件的內容?

如果我只是把這個類放入一個只有JFrame的小型獨立Swing應用程序中,箭頭鍵(特別是左和右)將圍繞文件名字段中的光標移動,但它不起作用在原始應用程序中。我檢查了所有容器的所有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的複合對象,它基本上只是一對聽衆。

如果有兩個偵聽器的結構非常簡單:

AWTEventMulticaster 
{ 
    first_listener_you_added; 
    second_listener_you_added; 
} 

如果你有三個監聽器,結構使用嵌套Multicaster S:

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

等等...

通過從這一點仔細追蹤您的應用程序,您應該能夠找到事件消耗的位置。

+0

非常感謝您的詳細和直接的答案! – Metaphox

+0

@Mepaphox你很受歡迎 – Michael

相關問題