2015-02-12 49 views
0

我基本上創建的是一個JDialog,它在窗體上有一個關鍵事件。所以當例如按下空格時,它會執行某些操作。這工作得很好,直到我在可編輯的同一個對話框上創建了一個JTextArea。當我這樣做時,我無法從JTextArea中刪除焦點並使熱鍵工作。我如何讓關鍵事件和JTextArea在同一個JDialog上運行?如何使關鍵事件在JDialog上工作,而JTextArea呢?

回答

0

您需要做的是將KeyListenerJDialog添加到JTextArea

下面是這個SSCCE。

import java.awt.event.*; 
import javax.swing.*; 

public class DialogListener { 

    public static void main(String[] args) { 
     JDialog dialog = new JDialog(); 
     dialog.setSize(300, 400); 
     dialog.setVisible(true); 

     KeyListener listener = getKeyListener(); 

     dialog.addKeyListener(listener); 

     JTextArea area = new JTextArea(); 
     area.addKeyListener(listener); 

     dialog.add(area); 
    } 

    public static KeyListener getKeyListener(){ 
     return new KeyAdapter() { 
      public void keyTyped(KeyEvent e) { 
       System.out.println(e.getKeyChar()); 
      } 
     }; 

    } 
} 
0

假設您已經爲您的JDialog對象定義了KeyListener

這是你可以得到一個組件的組件:

dialog.getContentPane().getComponents(); 

這是你如何能得到的KeyListener。你dialog的數組:

KeyListener[] keyListeners = dialog.getKeyListeners(); 

現在,讓我們遍歷並加上KeyListener s:

Component[] components = dialog.getContentPane().getComponents(); 
KeyListener[] keyListeners = dialog.getKeyListeners(); 
for (int componentIndex = 0; componentIndex < components.length; componentIndex++) { 
    for (int keyListenerIndex = 0; keyListenerIndex < keyListeners.length; keyListenerIndex++) { 
     components[componentindex].addKeyListener(keyListeners[keyListenerIndex]); 
    } 
} 

代碼未經測試,如果有任何錯別字,請告訴我。此外,這不是傳遞性的,也就是說,它並不適用於Components的聽衆,它僅爲兒童Component定義關鍵事件。