【发布时间】:2015-07-16 03:28:01
【问题描述】:
说实话,我真的不知道自己在做什么。 我刚从 python 迁移到 Java,我还在努力适应所有的类和类型的东西。
我决定放弃 Java 概念教程,开始动手实践。据我了解,我是用挥杆在屏幕上画一个球,让它移动。
我尝试设计一个球对象来处理球的位置和屏幕碰撞,但球根本没有移动。当我打开调试时,我注意到paint() 函数只在创建时被调用,而不是被repaint() 调用。
我有一种感觉,我正在使用一个糟糕的教程来做这些事情,看起来有更好的方法来做。
无论如何,我很高兴听到你们的想法。
编辑:在看到您的 cmets 后,我注意到当我将 sysout 放在那里时,实际上调用了paint。在我输入sysout in paint() 之前,调试器似乎没有跳转到那里。我的猜测是我并没有真正改变球的位置。
@SuppressWarnings("serial")
public class Tennis extends JPanel {
Ball ball = new Ball(50,50);
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int[] position = ball.getPosition();
g2d.fillOval(position[0],position[1], 30, 30);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Mini Tennis");
Tennis game = new Tennis();
frame.add(game);
frame.setSize(300, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while (true) {
// just change the position and check for bump
game.ball.move(game.getHeight(), game.getWidth());
game.repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
【问题讨论】:
-
使用 super.paintComponent(g) 代替 super.paint(g)。然后每次你想改变图形时,使用 repaint()
-
repaint()每秒被调用约 100 次,对吗?循环中没有发生什么奇怪的事情? -
实际方法应该是
paintComponent()而不是paint()。 -
“我有一种感觉,我正在使用一个糟糕的教程来做这些事情..” 链接到它。从它产生的代码的外观来看,这个教程很垃圾。
-
您发布的代码无法编译。
When I turn on the debug I noticed that the paint() function get called only at creation,- 对我来说很好。我在绘画方法中添加了一个 System.out.println(...) 语句,它会不断显示。如果您需要更多帮助,请发布正确的 SSCCE 来说明问题。