我有一个框架,里面是一个矩形。 我想知道如果单击箭头键,如何移动矩形。 我搜索过,找到一些例子,但没有任何效果(很奇怪,因为它应该是一件简单的事情)
这是我的Rectangle类:
public class PlayerOne implements KeyListener {
int x,y;
public PlayerOne(JPanel panel){
this.x = panel.getWidth()/2;
this.y = panel.getHeight()/2;
}
public void paint(Graphics g){
g.setColor(Color.RED);
g.fillRect(125, 480, 60, 10);
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
int keyCode = arg0.getKeyCode();
if(keyCode == arg0.VK_KP_RIGHT){
this.x+=5;
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
这是主要的:
public class PingPong extends JPanel {
private static final long serialVersionUID = -4170574729049260633L;
//Initialize
Table table = new Table();
PlayerOne po = new PlayerOne(this);
public void paintComponent(Graphics g){
super.paintComponent(g);
table.paint(g);
po.repaint(g);
}
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setTitle("Pong");
frame.setSize(326, 533);
frame.add(new PingPong()).setBackground(Color.DARK_GRAY);
frame.getContentPane().setBackground(Color.DARK_GRAY);
frame.setVisible(true);
}
}
答案 0 :(得分:2)
这里有很多问题:
问题是你的矩形绘图是硬编码的,在这里可以证明:
public void paint(Graphics g){
g.setColor(Color.RED);
g.fillRect(125, 480, 60, 10);
}
您需要使用x
变量而不是125
为了接受按键事件,您的JPanel需要接受焦点,这可以通过以下几行来实现:
setFocusable(true);
requestFocusInWindow();
您现在将收到键盘事件并更改x
值。不幸的是,这不会触发重新绘制,因此您的盒子仍然不会移动。
你应该把你的班级分开一点,因为你的责任分配有点奇怪。当发生关键事件时,您需要告诉您的JPanel repaint()
本身更新会反映在屏幕上。