java - KeyListener 不改变 JPanel

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



}

我使用这个 JPanel 的类是:

public class Tester
{
   public static void main(String[] args){

    MyPanel t=new MyPanel();
    JFrame jf=new JFrame();
    jf.setTitle("Tutorial");
    jf.setVisible(true);
    jf.setSize(600,400);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.getContentPane().add(t,BorderLayout.CENTER);

}
}

最佳答案

您的代码不起作用,因为您的面板没有焦点。

requestFocusInWindow() 方法仅在面板显示在 GUI 上可见时才起作用。在构造函数中调用该方法没有任何效果(并且不需要)。

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

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(t,BorderLayout.CENTER);
jf.setSize(600,400);
jf.setVisible(true);

关键是在框架可见之前将面板添加到内容 Pane 。让框架可见然后更改其大小也是没有意义的,因此我总是将框架设为可见作为最后一条语句。

I searched all the others posts but i couldn't find my error

我觉得这很难相信。这个问题每天都会被问到,我们总是建议使用Key Bindings,那么为什么您仍然尝试使用 KeyListener?

Swing 被设计为与键绑定(bind)一起使用。请参阅Motion Using the Keyboard了解更多信息和使用按键绑定(bind)的方法。

关于java - KeyListener 不改变 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22697284/

相关文章:

java - 动态地将 ListView 上的文本加粗到指定单词

java - 静态初始化器?

java - 结束话题

java - 带搜索的严格自动完成 JComboBox

java - setContentPane 覆盖了所有内容并且 JButton 无法正常工作

Java Swing-JPanel 与 JComponent

Java:验证特定的字符串模式

Java Swing画线程序不保留以前的线

java - 如何停止将已添加的值从 JCombobox 添加到 JTable

java - Java 中的 BorderLayout() 问题