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