添加计时器时,JPanel对KeyListener没有响应?

时间:2018-04-21 21:02:16

标签: 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 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();

    }
}

1 个答案:

答案 0 :(得分:0)

没有任何反应,因为只为具有焦点的组件生成KeyEvents。你的小组没有焦点。

代码的顺序应为:

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

那就是你需要在框架可见之前将组件添加到框架中,然后将焦点放在面板上。

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

使用Swing时更好的解决方案是使用Key Bindings。键绑定允许您将KeyStroke绑定到Action,即使组件没有焦点也是如此。有关详细信息,请阅读How to Use Key Bindings上的Swing教程中的部分。