【发布时间】:2014-11-05 03:23:15
【问题描述】:
所以我用 Java 创建了一个小窗口,上面有一个弹跳的球,并试图调试和观察程序的工作情况。这是问题的重要代码:
public class Ball {
private static final int SPEED = 2;
private int x = 0, y = 0;
private int xInc = SPEED, yInc = SPEED;
-> public void paint(Graphics2D g) {
g.fillOval(x, y, 30, 30);
}
}
public class Game extends JPanel {
Ball gameBall = new Ball();
public void paint(Graphics g) {
super.paint(g); // cleans the panel
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
gameBall.paint(g2d);
}
public void updateBall() {
gameBall.move(this.getWidth(), this.getHeight());
}
public static void main(String[] args) {
JFrame mainFrame = new JFrame("Simple Pong");
mainFrame.setSize(400, 400);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Game gamePanel = new Game();
mainFrame.add(gamePanel);
mainFrame.setVisible(true);
while (true) {
try {
gamePanel.updateBall();
gamePanel.repaint();
Thread.sleep(10);
} catch (InterruptedException e) {
System.out.println(e);
System.exit(1);
}
}
}
}
我为Ball的paint方法的入口设置了一个方法指针,以为每次调用repaint()方法都会导致程序停止,因为我认为它调用了paint方法。然后,我可以观察球一次移动一个增量,而不是在重绘方法所在的位置放置一个行指针。
当我这样做时,程序不会随着每次更新我的球的位置而停止,而是以看似随机的增量停止。球将接近边缘,然后在中间发生了如此多的油漆要求。
问题:repaint 方法是否总是为我的轻量级容器调用paint 方法?如果是这样,为什么调试器不会随着球的每次增量而停止,而是有时只停止以显示新位置?显然,如果球在运行时在屏幕上平稳移动,则某些东西正在将 Ball 对象完全按照我的意愿绘制到我的游戏面板上。
注意:如果我们为 Game 的绘制方法的入口放置一个方法断点,也会发生同样的事情,我扩展了 JPanel 并且我在上面绘制了球。
【问题讨论】:
标签: java swing debugging jpanel paint