Java JPanel没有';当我添加计时器时,是否没有响应KeyListener?
我不明白为什么我添加以下内容时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
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)它对我不起作用,这是有线的??