java - 从 Java 中的另一个类调用重绘?

标签 java multithreading swing animation timer

我可能做错了,所以请保持友善。 我正在开发一个 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/

相关文章:

java - 如何输入、计算和更新JLabel?

java - Selenium WebDriver FluentWait

java - 嵌套数据结构问题

.net - 我们应该使用自己的线程还是线程池来执行小型且频繁的任务?

java - interrupt() 空闲线程而不是 wait()/notify() 会更好吗?

java - JList Swing 添加描述到列表项

java - 基本MVC构建,ActionListener不起作用

java - com.fasterxml.jackson.databind.exc.InvalidDefinitionException : No serializer found

java - 如何使用 JSoup 从 Sports Reference 的数据表中检索数据?

java - 带 gui 的多线程 JavaChat