我正在学习Java,并且我尝试构建了一个在单击面板时会丢球的应用程序。问题在于,绘制椭圆形时,其移动速度如此之快,以至于即使将Thread.sleep设置为最大值也几乎看不到它。我如何放慢速度?
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.red);
g2.drawOval(x,y,20,20);
Thread thread = new Thread() {
public void run() {
while (true) {
y = y + 1;
repaint();
try {
Thread.sleep(2147483647);
}
catch (InterruptedException ex) {
}
}
}
};
thread.start();
}
答案 0 :(得分:1)
我还没有在自己的环境中尝试过您的程序,但是据我所知,似乎正在使您动弹的是:
y = y + 1;
行,因此您可以考虑将其更改为较小的数字,最有可能是两倍。另外,如前所述,也许您可以尝试不使用:
while (true)
陈述,因为这将永远永远评估为true,这不是最大的问题,但是也许您可以考虑使用其他东西,例如使用与y
变量有关的东西,例如:{{ 1}}或什至是for循环之类的东西,这取决于您在做什么。
希望这会有所帮助,我也建议您在这里查看以下答案: Java Graphics Updating Too Fast
祝你一切顺利!
答案 1 :(得分:0)
摆脱使用paintComponent
方法创建线程的作用。
您需要将java Swing Timer
与actonListener
一起使用,以
增加x和y坐标,然后调用repaint()
。检查Java API以获取详细信息。
启动程序时,使用SwingUtilities.invokeLater(()->new className())
调用该类。这会将应用程序安排在队列中,以便在事件调度线程(EDT)中进行处理。所有事件和重绘都需要在EDT中进行处理。
在paintComponent方法中,通过setRenderingHints使用Graphics2D设置抗锯齿。 Java API中也对此进行了说明。通过平均边缘,可以使图形看起来更平滑。