我不明白为什么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();
}
}
答案 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教程中的部分。