我可能做错了,所以请保持友善。 我正在开发一个 Java 游戏,我正处于测试角色移动/动画的阶段。
“人”可以在网格上上下左右移动。 绘制网格的类是 gamePanel 类。 这些按钮位于 gameControlPanel 类中。
我有一个按钮可以在网格上生成一个人。 然后我有一个按钮可以左右移动这个人。
当按下向上移动按钮时,它会调用 person 类的向上移动方法。 (目前,我一次只测试一个“人”。) 在该方法中是以下代码...
int move = 10;
while(move!=0)
{
setTopLeftPoint(new Point((int)getTopLeftPoint().getX(),
(int)getTopLeftPoint().getY() - 3));
try
{
Thread.sleep(300);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
move-=1;
}
问题是我似乎无法从 Person 类中调用 gamePanel 类的重绘方法。 为了解决这个问题,我在 gamePanel 类中创建了一个计时器,它每 20 毫秒重绘一次。
当人生成后我按下向上按钮时,按钮会保持按下状态直到 while 循环的循环完成,然后人的圆圈表示会显示在上面的方格中。
我会尽力回答与此相关的任何问题。
最佳答案
repaint() 不会立即重新绘制 GUI。相反,它向 AWT 线程发送一条消息,告诉它在下一个方便的机会进行绘制。如果有机会,它会重新绘制您的应用程序。但是,如果您在事件处理程序中执行此操作,那么 AWT 线程已经很忙,您需要退出处理程序以将控制权交还给 AWT 处理程序。
作为一般经验法则,您不想在 AWT 线程上(包括在事件处理程序中)执行任何长时间运行的计算,因为这些会阻止应用程序响应其他事件直到你的计算完成。这通常会像您描述的那样向用户显示为卡住按钮。要解决这个问题,请使用 SwingWorker它可以在单独的线程上进行计算。
最后,需要注意(但不一定要更改)的是计时器和 sleep 不能保证它们何时唤醒。相反,他们保证在时间过去之前不会醒来,但理论上可以无限期地 hibernate 。此外,并非所有机器都具有 1 毫秒的计时器分辨率。特别是,在许多 Windows 机器上,计时器的分辨率只有 55 毫秒,因此 20 毫秒的计时器可能会产生奇怪的结果。
关于java - 从 Java 中的另一个类调用重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/772713/