Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel密钥侦听器不工作_Java_Swing_Jpanel_Keylistener - Fatal编程技术网

Java JPanel密钥侦听器不工作

Java JPanel密钥侦听器不工作,java,swing,jpanel,keylistener,Java,Swing,Jpanel,Keylistener,我正在制作一个包含多个类的大型程序,我编写的一些代码有问题。我的鼠标监听器工作得很好,使用相同的步骤,我的按键监听器不工作。我的代码如下 主要方法 public static void main(String[] args) { window._init_(panel); } 窗口初始化方法: public void _init_(JPanel panel){ window = new JFrame("Asteroid"); window.setPreferredSiz

我正在制作一个包含多个类的大型程序,我编写的一些代码有问题。我的鼠标监听器工作得很好,使用相同的步骤,我的按键监听器不工作。我的代码如下

主要方法

public static void main(String[] args) {
    window._init_(panel);
}
窗口初始化方法:

public void _init_(JPanel panel){
    window = new JFrame("Asteroid");
    window.setPreferredSize(size);
    window.setDefaultCloseOperation(closeOpp);
    window.add(panel);
    window.getContentPane();
    window.setResizable(resizable);
    window.setFocusable(focusable);
    window.pack();
    window.setLocationRelativeTo(location);
    window.setVisible(visibility);
}
public MainPanel(){
    //panel initialization
    System.out.println("inside constructor");
    panel = new JPanel();
    this.add(panel);
    this.addKeyListener(this);
    this.addMouseListener(this);
    this.addMouseMotionListener(this);
    this.setSize(Window.size);
    this.setFocusable(Window.focusable);
    this.add(b);
    this.setVisible(Window.visibility);
}
面板初始化方法:

public void _init_(JPanel panel){
    window = new JFrame("Asteroid");
    window.setPreferredSize(size);
    window.setDefaultCloseOperation(closeOpp);
    window.add(panel);
    window.getContentPane();
    window.setResizable(resizable);
    window.setFocusable(focusable);
    window.pack();
    window.setLocationRelativeTo(location);
    window.setVisible(visibility);
}
public MainPanel(){
    //panel initialization
    System.out.println("inside constructor");
    panel = new JPanel();
    this.add(panel);
    this.addKeyListener(this);
    this.addMouseListener(this);
    this.addMouseMotionListener(this);
    this.setSize(Window.size);
    this.setFocusable(Window.focusable);
    this.add(b);
    this.setVisible(Window.visibility);
}
面板侦听器方法

@Override
public void keyPressed(KeyEvent e) {
    System.out.println("key pressed");
}
@Override
public void keyReleased(KeyEvent e) {
    System.out.println("key released");
}
@Override
public void mouseClicked(MouseEvent e) {
    System.out.println("mouse clicked");
}
public void keyTyped(KeyEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}

ps.面板实现了所有使用的侦听器,定义了所有变量,程序运行时没有错误

您将焦点设置为帧而不是JPanel,但即使将焦点更改为JPanel,也会产生不可预测的行为,因为JPanel很容易失去焦点。我建议您使用键绑定或更改keylistner方法和其他重写方法以附加到JFrame而不是JPanel,以确保在使用应用程序时保持焦点。

欢迎来到精彩的世界,了解我们为什么不推荐
KeyListener
。你应该找一个解决方案来解决
KeyListener
的短提交问题,我在看
b
,我想知道它是否是
JButton
,它很可能会窃取焦点“你的设置聚焦于你的帧而不是JPanel”-我看不到他们调用
requestFocusXxx