我正在试着做一个乒乓球游戏,但是我的乒乓球拍由于某些原因不能正确地移动。
当我按向下箭头键时,它会很好地向下移动。但是当我按向上箭头键的时候,整个划水方向就变得更长了。如果我调整窗口的大小,那么在那个位置,划桨会返回到它的正常长度。如果我再次按向上键,它会继续向上延伸。
我认为这不是我的代码逻辑,而是关于清除之前绘制的面板的问题……这是我的代码,
Paddle的代码:
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;
public class Paddle extends JPanel {
int x;
int y;
int width;
int height;
Paddle(){
this.x = 0;
this.y = 0;
this.height = 40;
this.width = 10;
}
Paddle(int x, int y, int width, int height){
this.x = x;
this.y = y;
this.height = height;
this.width = width;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(x, y, width, height);
}
public void moveDown(){
this.y += 3;
repaint();
System.out.println("h: " + height + " x: " + x + " y: " + y + " getW: " + getWidth() + " getH: " + getHeight());
}
public void moveUp(){
this.y -= 3;
repaint();
System.out.println("h: " + height + " x: " + x + " y: " + y + " getW: " + getWidth() + " getH: " + getHeight());
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}整个游戏的代码:
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Pong extends JFrame {
Pong() {
final Paddle p1Paddle = new Paddle();
Paddle p2Paddle = new Paddle();
p1Paddle.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
//super.keyPressed(arg0);
switch (e.getKeyCode()) {
case KeyEvent.VK_DOWN:
p1Paddle.moveDown();
break;
case KeyEvent.VK_UP:
p1Paddle.moveUp();
break;
default:
System.out.println("please press up or down");
}
}
});
setLayout(new BorderLayout());
add(p1Paddle, BorderLayout.CENTER);
//only focused components can recieve key events...
p1Paddle.setFocusable(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new Pong();
frame.setTitle("Pong");
frame.setSize(650, 300);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}任何关于这个问题的帮助或通用的代码建议都将不胜感激。
发布于 2012-07-10 13:32:37
从代码片段中很难看出,但是,KeyListeners并不是很可靠。如果按键被使用(由UI和底层实现),您可能不会收到通知。
试着看一下InputMap和ActionMap。
InputMap im = getInputMap(JTable.WHEN_FOCUSED_COMPONENT);
ActionMap am = getActionMap();
KeyStroke downKey = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
KeyStroke upKey = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
im.put(downKey, "Action.down");
im.put(upKey, "Action.up");
am.put("Action.down", new DownAction());
am.put("Action.up", new UpAction());看看它会把你带到哪里。
更新:啊,现在很明显,你已经覆盖了面板的x/y宽度/高度方法,期望布局管理器使用它们来布局组件,但并没有真正提供一个知道如何处理它的布局管理器。
BorderLayout不关心你的“大小”或“位置”要求,它会用它认为你的组件应该是什么来覆盖它们。
您想要做的是使用绝对布局管理器(null)。此外,您不希望实现X/Y、宽/高管理,因为这已经为您处理好了。
所以。
在乒乓课上。将布局管理器从BorderLayout更改为null (还要更新add(paddle)方法以删除BorderLayout引用,这不是必需的,但会消除混淆)。
在Paddle类中,移除所有对x/y,width/height的引用,你不需要它们。取而代之的是setBound/setLocation。
public class Paddle extends JPanel {
Paddle(){
this(0, 0, 20, 40);
}
Paddle(int x, int y, int width, int height){
setBounds(x, y, width, height);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
// The graphics context has already been translated to x/y for use,
// so we don't need to care about it
g.fillRect(0, 0, getWidth(), getHeight());
}
public void moveDown(){
setLocation(getX(), getY() + 3);
}
public void moveUp(){
setLocation(getX(), getY() - 3);
}}
还有中提琴,它很管用。
https://stackoverflow.com/questions/11401053
复制相似问题