我有一个尝试在Java中运行的线程,用于制作游戏。线程本质上会休眠一下,更新对象,然后调用repaint()。看起来它应该工作得很好,它看起来像我在互联网上找到的代码,但它不起作用。
代码在这里:
@Override
public void run() {
int sleep = 500;
Dimension dim = getSize();
while(true){
try {
Thread.sleep(sleep);
System.out.println("Sleeping!");
} catch (InterruptedException e) {
System.out.println("interrupted");
}
for(int i = 0 ; i < poop.size() ; i++){
poop.get(i).update(dim.width, dim.height);
System.out.println("Y is: "+poop.get(i).getYCoord()+" Step is: "+poop.get(i).getYStep());
}
repaint();
}
}
当我将try catch块放入for循环,调用正常时,会发生问题,System.out也会打印Y坐标,但更新不再起作用。任何想法都会很棒。如果您需要更多代码,请告诉我,我也将更新代码放在这里。另外对待我就像初学者一样,我或多或少都是线程,也是初学者或多或少地使用摇摆库。
这是update()代码:
@Override public void update(int screenWidth, int screenHeight)
{
xCoord += xStep;
if (xCoord > screenWidth) {
xCoord = 0;
} else if (xCoord < 0) {
xCoord = screenWidth;
}
yCoord += yStep;
if (yCoord > screenHeight) {
yCoord = 0;
} else if (yCoord < 0) {
yCoord = screenHeight;
}
}
答案 0 :(得分:0)
即使此代码位于run()
方法中,并且可能位于Runnable对象中,但您的描述仍然是在Swing事件线程上调用Thread.sleep(...)
的症状。如果这样做,则将整个GUI置于休眠状态,因为您正在睡眠的事件线程负责绘制GUI并与用户交互。
解决方案:不要那样做。执行任何长时间运行的任务或睡在后台线程中,例如在SwingWorker中。
或者,摆脱你的Thread.sleep(...)
并改为使用Swing Timer。
答案 1 :(得分:0)
在for循环完成之前,你不会调用repaint()
。所以坚持睡在里面不会导致它每500毫秒一次重绘一件事。这将导致它只需要size() * 500
来完成循环,然后立即重新绘制所有内容。
答案 2 :(得分:0)
这里的问题是Dimension dim = getSize();
由于某种原因将两者都设置为0。因此更新方法无法完成它的工作。