Java JPanel没有';当我添加计时器时,是否没有响应KeyListener?

Java JPanel没有';当我添加计时器时,是否没有响应KeyListener?,java,swing,actionlistener,Java,Swing,Actionlistener,我不明白为什么我添加以下内容时JPanel不响应KeyListener: timer = new Timer(80,this); timer.start(); 当我评论它时,它就起作用了 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JPanel implements KeyListener,ActionListener{ private st

我不明白为什么我添加以下内容时JPanel不响应KeyListener:

timer = new Timer(80,this);
timer.start();
当我评论它时,它就起作用了

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Test extends JPanel implements KeyListener,ActionListener{

    private static final long serialVersionUID = 1L;
    private Timer timer ;
    public Test( )  {
        addKeyListener(this);
        setFocusable(true);
        setBackground(Color.RED);
        setFocusTraversalKeysEnabled(false);
        setPreferredSize(new Dimension(700, 700));
        //timer = new Timer(80,this);
        //timer.start();
    }
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        Test t = new Test();
        frame.add(t);
        frame.pack();

    }
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("pressed");

    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //timer.start();

    }
}

不会发生任何事情,因为KeyEvents仅为具有焦点的组件生成。您的面板没有焦点

代码的顺序应为:

    Test t = new Test();
    frame.add(t);
    frame.pack();
    frame.setVisible(true);
也就是说,在框架可见之前,需要将组件添加到框架中,然后将焦点放置在面板上

但是,这仍然不是正确的解决方案,因为面板可能会失去焦点,在这种情况下,代码将停止工作


使用Swing时更好的解决方案是使用
键绑定
。键绑定允许您将
击键
绑定到
操作
,即使组件没有焦点。阅读Swing教程上的部分以了解更多信息。

我已经尝试了你的代码,一切都很好-无论是否使用
计时器
code谢谢(drkunibar)它对我不起作用,这是有线的??