Java KeyListener不更改JPanel

Java KeyListener不更改JPanel,java,swing,jpanel,keylistener,Java,Swing,Jpanel,Keylistener,因此,我创建了一个JPanel的扩展版本,不幸的是,它不响应任何键输入。你能告诉我有什么问题吗?我搜索了所有其他帖子,但没有找到我的错误 public class MyPanel extends JPanel implements ActionListener,KeyListener{ Timer tm=new Timer(5,this); int x=0,y=0 ,velX=0, velY=0; public MyPanel(){ tm.start(); addKeyLis

因此,我创建了一个JPanel的扩展版本,不幸的是,它不响应任何键输入。你能告诉我有什么问题吗?我搜索了所有其他帖子,但没有找到我的错误

public class MyPanel extends JPanel implements ActionListener,KeyListener{

Timer tm=new Timer(5,this);
int x=0,y=0 ,velX=0, velY=0;

public MyPanel(){
    tm.start();
    addKeyListener(this);
    setFocusable(true);
    requestFocusInWindow();
}

public void paintComponent(Graphics g){
    super.paintComponent(g);

    g.fillRect(0,0,this.getWidth(),this.getHeight());
     g.setColor(Color.RED);
    g.fillRect(x,30,50,30);



}

public void actionPerformed(ActionEvent e){

    if(x<0||x>370)
    velX=-velX;

    if(y<0||y>370)
    velY=-velY;

    y=y+velY;
    x=x+velX;
    repaint();
}

public void keyPressed(KeyEvent e){
    int c=e.getKeyCode();
    System.out.println("Cascsadas");
    if(c==KeyEvent.VK_LEFT){
        velX=-1;
        velY=0;
    }

    if(c==KeyEvent.VK_UP){
        velX=0;
        velY=-1;
    }

     if(c==KeyEvent.VK_RIGHT){
        velX=1;
        velY=0;
    }

    if(c==KeyEvent.VK_DOWN){
        velX=0;
        velY=1;
    }

}

public void keyTyped(KeyEvent e){};
public void keyReleased(KeyEvent e){};



}

您的代码无法工作,因为您的面板没有焦点

requestFocusInWindow()方法仅在面板显示在GUI上时有效。在构造函数中调用该方法没有效果(也不需要)

但是,真正的问题是在框架可见后将面板添加到框架中。您的代码应该类似于:

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(t,BorderLayout.CENTER);
jf.setSize(600,400);
jf.setVisible(true);
关键是在框架可见之前将面板添加到内容窗格。使框架可见然后更改其大小也是没有意义的,因此我总是将框架作为最后一条语句使其可见

我搜索了所有其他的帖子,但没有找到我的错误

我觉得很难相信。这个问题每天都会被问到,我们总是建议使用
键绑定
,那么为什么您仍在尝试使用KeyListener呢


Swing设计用于键绑定。有关更多信息和使用键绑定的方法,请参阅。

由于面板没有焦点,因此代码无法工作

requestFocusInWindow()方法仅在面板显示在GUI上时有效。在构造函数中调用该方法没有效果(也不需要)

但是,真正的问题是在框架可见后将面板添加到框架中。您的代码应该类似于:

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(t,BorderLayout.CENTER);
jf.setSize(600,400);
jf.setVisible(true);
关键是在框架可见之前将面板添加到内容窗格。使框架可见然后更改其大小也是没有意义的,因此我总是将框架作为最后一条语句使其可见

我搜索了所有其他的帖子,但没有找到我的错误

我觉得很难相信。这个问题每天都会被问到,我们总是建议使用
键绑定
,那么为什么您仍在尝试使用KeyListener呢


Swing设计用于键绑定。有关更多信息和使用键绑定的方法,请参阅。

由于面板没有焦点,因此代码无法工作

requestFocusInWindow()方法仅在面板显示在GUI上时有效。在构造函数中调用该方法没有效果(也不需要)

但是,真正的问题是在框架可见后将面板添加到框架中。您的代码应该类似于:

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(t,BorderLayout.CENTER);
jf.setSize(600,400);
jf.setVisible(true);
关键是在框架可见之前将面板添加到内容窗格。使框架可见然后更改其大小也是没有意义的,因此我总是将框架作为最后一条语句使其可见

我搜索了所有其他的帖子,但没有找到我的错误

我觉得很难相信。这个问题每天都会被问到,我们总是建议使用
键绑定
,那么为什么您仍在尝试使用KeyListener呢


Swing设计用于键绑定。有关更多信息和使用键绑定的方法,请参阅。

由于面板没有焦点,因此代码无法工作

requestFocusInWindow()方法仅在面板显示在GUI上时有效。在构造函数中调用该方法没有效果(也不需要)

但是,真正的问题是在框架可见后将面板添加到框架中。您的代码应该类似于:

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(t,BorderLayout.CENTER);
jf.setSize(600,400);
jf.setVisible(true);
关键是在框架可见之前将面板添加到内容窗格。使框架可见然后更改其大小也是没有意义的,因此我总是将框架作为最后一条语句使其可见

我搜索了所有其他的帖子,但没有找到我的错误

我觉得很难相信。这个问题每天都会被问到,我们总是建议使用
键绑定
,那么为什么您仍在尝试使用KeyListener呢


Swing设计用于键绑定。有关更多信息和确实使用键绑定的方法,请参阅。

我在这里发布了相同上下文中的答案

这篇文章将帮助你更好地理解它


以下是要开始的示例代码:

(同时沿所有方向向左、向右、顶部、底部和对角移动)

导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.Set;
导入java.util.TreeSet;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类Apple扩展JPanel实现ActionListener、KeyListener{
Timer Timer=new Timer(5,this);//这是指actionListener
int x=0,velx=0;
int y=0,vely=0;
公共苹果公司(){
timer.start();
addKeyListener(this);//这是指keylistener
设置聚焦(真);
setFocusTraversalKeysEnabled(false);//因为我们没有使用shift或ctrl键
}
公共组件(图形g){
超级组件(g);
//外矩形
g、 setColor(Color.BLUE);
g、 fillRect(x,y,50,50);
}
公共静态void main(字符串[]args){
苹果=新苹果();
苹果。设置大小(500500);
JFrame=新JFrame();
框架。添加(苹果);
frame.setLayout(空);
frame.setTitle(“游戏”);
框架。设置尺寸(500500);
frame.setVisible(true);
frame.setresizeable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@凌驾
//为矩形设置动画
已执行的公共无效操作(操作事件arg0){
if(x<0){
velx=0;
x=0;
}
如果(x>450){
velx=0;
x=450;
}
if(y<0){