【发布时间】:2012-12-30 01:27:02
【问题描述】:
我正在学习一些 Java 中的 swing 和 awt 编程,所以我决定制作 Pong。 Main 类是父 JFrame。它实例化一个 Ball 和一个 Paddle 并添加它们(它们是 JPanel)。但是,仅显示添加的最后一个。我该如何解决这个问题?
代码:
public class Main extends JFrame {
public Main() {
super("Pong");
add(new Ball());
add(new Paddle());
setSize(500, 500);
setBackground(Color.orange);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Main().setVisible(true);
}
}
球类:
public class Ball extends JPanel implements ActionListener {
Timer timer;
private Vec2d position;
private Vec2d velocity;
private Dimension ballSize;
public Ball() {
super();
position = new Vec2d(50, 50);
velocity = new Vec2d(2, 3);
timer = new Timer(25, this);
ballSize = new Dimension(40, 40);
timer.start();
}
@Override
public void actionPerformed(ActionEvent ae) {
//Perform game frame logic
bounceBall();
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillArc((int)position.x, (int)position.y, ballSize.width,
ballSize.height, 0, 360);
position.add(velocity);
}
private void bounceBall() {
if(position.x < 0 || position.x > getWidth() - ballSize.width) {
velocity.x *= -1;
}
if (position.y < 0|| position.y > getHeight() - ballSize.height) {
velocity.y *= -1;
}
}
}
最后是 Paddle 类:
public class Paddle extends JPanel implements ActionListener {
private Vec2d position;
private double yVelocity;
private Rectangle rect;
private Timer timer;
public Paddle() {
super();
position = new Vec2d(30, 250);
yVelocity = 0;
timer = new Timer(25, this);
timer.start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.fillRect((int) position.x, (int) position.y, 20, 40);
}
@Override
public void actionPerformed(ActionEvent ae) {
repaint();
}
}
请注意,Vec2d 只是我拼凑的一个小型二维 Vector 类。此外,Pong 逻辑(桨与球之间的碰撞、得分等)未实现。我只是想让它正确绘制
提前感谢您的帮助!
【问题讨论】:
-
顺便说一句,您的
Main类永远不会创建您的 JPanel 实例。 -
我出于调试目的将它们取出并忘记将它们放入问这个问题。 愚蠢的我!无论如何它都无法正常工作。
-
您的
Main类不使用layoutManager。顺便说一句,如果您不明确使用布局管理器,它始终默认为BorderLayout -
+1 用于 SSCCE,与问题无关,但是,1) 不要扩展
JFrame2) 不要在JFrame上调用setSize,而是实现正确的LayoutManager和/或覆盖 @987654334 @ ofJPanel并返回适合图纸的正确尺寸,然后在将其设置为可见之前在JFrame上调用pack()。 3) 始终通过SwingUtiltities.invokeXXX块在 Event Dispatch Thread 上创建 Swing 组件。 -
正如 JB Nizet 和 Reimeus 所说,您正在将您的 JPanel 添加到相同的位置,我不相信您现在需要的是
LayoutManager,因为这是唯一一次 IMO @应该使用 987654340@ 您的实体是Components 的扩展,而不是建模为实体的类(一个包含与getX()、getY()等实体相关的属性的类)- 这是一个这样的例子逻辑:stackoverflow.com/questions/13999506/threads-with-key-bindings/…