所以我创建了 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/