Java KeyEvent不适用于JTextArea,但适用于包含JTextArea的JFrame

Java KeyEvent不适用于JTextArea,但适用于包含JTextArea的JFrame,java,swing,jtextarea,keylistener,Java,Swing,Jtextarea,Keylistener,我一直在寻找答案,但我只找到了答案,而不是原因,所以我要问这个问题: 我是GUI编程新手。在练习一些关于关键事件处理的代码时,我遇到了一个JFrame中包含JTextArea的示例。keylistener接口由框架本身实现。当按下某个键时,文本区域会根据所按下的键显示一些相关信息。代码运行良好 但我尝试了不同的方法,尝试将JTextarea注册到keyListenr而不是JFrame。但是,这对关键事件没有响应。下面是代码。请帮忙 public class KeyDemoFrame extend

我一直在寻找答案,但我只找到了答案,而不是原因,所以我要问这个问题:

我是GUI编程新手。在练习一些关于关键事件处理的代码时,我遇到了一个JFrame中包含JTextArea的示例。keylistener接口由框架本身实现。当按下某个键时,文本区域会根据所按下的键显示一些相关信息。代码运行良好

但我尝试了不同的方法,尝试将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 ) );
        }
    }
}

仅供使用

如果你想

仅供使用

如果你想


这种行为的原因是JTextComponent处理KeyEvent。正如mKorbel已经指出的,您应该为JTextComponents使用DocumentListener,这种行为的原因是JTextComponent处理KeyEvent。正如mKorbel已经指出的,您应该使用DocumentListener for JTextComponents

更准确地说,之所以会发生这种情况,是因为您正在扩展JFrame,并且您正在将Listener添加到框架本身,而不是按照您的要求将其添加到JTextArea。正如@mKorbel所建议的,您应该使用DocumentListener for JTextComponent:-更确切地说,为什么会发生这种情况,是因为您正在扩展JFrame,并且您正在将侦听器添加到帧本身,而不是按照您的需要将其添加到JTextArea。正如@mKorbel所建议的,您应该使用DocumentListener for JTextComponent:-
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);
}
}