【发布时间】:2014-03-02 12:31:54
【问题描述】:
我正在制作一个简单的乒乓球游戏;部分碰撞机制需要获取画布的宽度和高度来重定向球。但是,getWidth() 和 getHeight() 出于某种原因返回 0。这是主要的代码块。
package pong;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main extends JPanel {
static int gameSpeed = 10;
Ball ball = new Ball(this);
private void move() {
ball.move();
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
ball.paint(g2d);
}
public static void main(String args[]) throws InterruptedException {
JFrame frame = new JFrame("Pong");
Main game = new Main();
frame.add(game);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while (true) {
game.move();
game.repaint();
Thread.sleep(gameSpeed);
}
}
}
这是处理移动条件的实际 Ball 类。
package pong;
import javax.swing.*;
import java.awt.*;
public class Ball extends JPanel {
int x = 1;
int y = 1;
int dx = 1;
int dy = 1;
private Main game;
public Ball(Main game) {
this.game = game;
}
void move() {
System.out.println(getWidth() + getHeight());
if (x + dx < 0) {
dx = 1;
}
if (y + dy < 0) {
dy = 1;
}
if (x + dx > (getWidth() - 30)) {
dx = -1;
}
if (y + dy > (getHeight() - 30)) {
dy = -1;
}
x = x + dx;
y = y + dy;
}
public void paint(Graphics2D g) {
g.fillOval(x, y, 30, 30);
}
}
编辑:问题解决了,我只是没有告诉 getWidth() 和 getHeight() 指的是什么。显然,如果我不告诉他们要获得什么,他们将返回 null。德普。简单的解决方法是将它们更改为 game.getWidth() 和 game.getHeight()。不过感谢您的帮助!您的所有输入也有助于其他领域。 :)
【问题讨论】:
-
不要覆盖paint,而是使用paintComponent。确保调用 super.paintXxx 来维护绘制链。小心在 Swing 中使用无限循环,因为它们可能会阻止应用程序重新绘制。 Swing Timer 会更安全或显式线程。不要依赖幻数(一旦更正)使用 getWitdh 和 getHeight 来确定应该绘制的区域
-
小example,用于覆盖
getPreferredSize(),请阅读其中指定的链接以获得进一步帮助:-)
标签: java swing jpanel paint thread-sleep