2012-05-14 2 views
2

я искал ответы, но все, что я нашел это workaounds, а не причину, поэтому я задаю этот вопрос:KeyEvent не функционирует JTextArea, но работает для JFrame, содержащий JTextArea

Я новичок в программировании GUI , Практикуя некоторый код, касающийся обработки ключевых событий, я столкнулся с примером, в котором JTextArea содержится внутри JFrame. Интерфейс keylistener реализуется самим Frame. При нажатии клавиши в текстовой области отображается соответствующая информация на основе нажатой клавиши. код работает нормально.

но я попытался пойти по-другому и попытался зарегистрировать JTextarea на keyListenr вместо JFrame. Однако это не отвечает на ключевые события. Вот код ниже. Пожалуйста помоги.

public class KeyDemoFrame extends JFrame 
{ 
private String line1 = ""; 
private String line2 = ""; 
private String line3 = ""; 
private JTextArea textArea; 

public KeyDemoFrame() 
{ 
    super("Demonstrating Keystrong events"); 
    textArea = new JTextArea(10,21); 
    textArea.setText("Press any key on keyboard"); 
    textArea.setEnabled(false); 
    textArea.setDisabledTextColor(Color.BLACK); 
    add(textArea); 
    //addKeyListener(this); 

    KeyEventHandler keyStrokeHandler = new KeyEventHandler(); 
    addKeyListener(keyStrokeHandler); 
} 
    private class KeyEventHandler implements KeyListener 
    { 
     public void keyPressed(KeyEvent event) 
     { 
      line1 = String.format("Your pressed the %s key", KeyEvent.getKeyText(event.getKeyCode())); 
      setLines2and3(event); 

     } 
     public void keyReleased(KeyEvent event) 
     { 
      line1 = String.format("You released %s key", KeyEvent.getKeyText(event.getKeyCode())); 
      setLines2and3(event); 
     } 
     public void keyTyped(KeyEvent event) 
     { 
      line1 = String.format("You typed %s key",KeyEvent.getKeyText(event.getKeyCode())); 
      setLines2and3(event); 
     } 
     private void setLines2and3(KeyEvent event) 
     { 
      line2 = String.format("This key is %san action key", (event.isActionKey()?"":"not ")); 
      String temp = KeyEvent.getKeyModifiersText(event.getModifiers()); 
      line3 = String.format("Modifier keys pressed: %s",(temp.equals("") ? "none" : temp)); 
      textArea.setText(String.format("%s\n%s\n%s\n",line1, line2, line3)); 
     } 
    } 

}

import javax.swing.JFrame; 

public class KeyDemo 
{ 
public static void main(String[] args) 
{ 
    KeyDemoFrame keyDemoFrame = new KeyDemoFrame(); 
    keyDemoFrame.setSize(300, 100); 
    keyDemoFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    keyDemoFrame.setVisible(true); 
} 
} 
+0

Чтобы быть более точным, что происходит, это потому, что вы расширяете 'JFrame', и вы добавляете' Listener' к самому кадру, а не к добавив его в 'JTextArea' по вашему желанию. И, как советовал @mKorbel, вы должны использовать 'DocumentListener' для' JTextComponent' :-) –

ответ

2

Причиной такого поведения является т шляпа JTextComponent обрабатывает KeyEvent. Поскольку mKorbel уже указал, вы должны использовать DocumentListener для JTextComponent s