有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JFrame中一次显示一个对象,或逐帧显示对象

我用Java(eclipse)编写了一个程序,使用JFrame在网格上显示正方形和三角形。程序确定对象在“for循环”中的位置。我想让对象一次出现一个(以逐帧的方式)。似乎应该用“睡眠循环”来解决这个问题。但是我觉得对java缺乏了解。awt*;给我带来了麻烦。我在“for循环”中添加了以下内容

try
{
Thread.sleep(1000); // do nothing for 1000 miliseconds (1 second)
}
catch(InterruptedException e)
{
e.printStackTrace();
}

程序等待,但在完成睡眠后立即绘制所有对象。我检查了我的程序,发现这个“sleep”命令在某种程度上起作用(在处理下一个命令之前等待)。我在所说的“for loop”中放入一个println语句来测试它,程序在打印每个println之前等待一秒钟。但我不知道为什么JFrame在最后只画一次所有的东西。每次我想显示一个新的帧时,我应该使用类似repaint()的东西吗

我的项目结构是三个班。Main,它只是调用DisplayFrame。用于设置帧的DisplayFrame。以及MyComponent,其中包含我的“for循环”和“sleep命令”

任何帮助都将不胜感激


共 (3) 个答案

  1. # 1 楼答案

    有一个教程here使用Timer定期更新图像。示例程序是一个小程序,但原理是一样的

  2. # 2 楼答案

    睡觉可能是个坏主意。改用计时器:

    http://download.oracle.com/javase/6/docs/api/javax/swing/Timer.html

    从你的描述中,有点难以猜测发生了什么,但我几乎可以肯定至少有两件坏事正在发生:

    • 您正在EDT(事件调度线程)中睡眠,这会锁定整个GUI,可能是您在睡眠期间看不到任何更新的原因

    • 您正在从EDT之外更改swing组件,这无疑是进入并发地狱的一条途径

    确保遵循以下方法:

    设置在所需时间间隔内给你打电话的时间(假设每0.1秒一次)。在名为“操纵”的方法中,操作组件/对象以反映新状态并调用“重新绘制”

    让我们知道它是否有效。我不太确定重新粉刷电话的事。。。可能是错的

  3. # 3 楼答案

    有趣的是,Oracle站点上的Applet Tutorial有一个小程序示例,它使用SwingWorkers和计时器执行动画。也许它对你有用

    或者,您可以使用游戏世界中的概念控制JFrame的渲染,如here