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

时间:2011-03-23 19:02:13

标签: java jframe

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

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

程序等待,但在完成睡眠后立即绘制所有对象。我已经完成了我的程序并发现这个“睡眠”命令在某种程度上正在工作(在处理下一个命令之前等待)我在所述“for循环”中放置了一个println语句来测试它,程序在打印之前等待一秒钟的println。但我不知道为什么JFrame最后只会绘制一次。每当我想要显示一个新框架时,我应该使用像repaint()这样的东西吗?

我的项目结构是3个班级。只需调用DisplayFrame的Main。 DisplayFrame用于设置Frame。和MyComponent包含我的“for循环”和“睡眠命令”。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

有一个教程here使用Timer定期更新图片。示例程序是一个applet,但原理是相同的。

答案 1 :(得分:1)

睡觉可能是一个坏主意。改为使用定时器:

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

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

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

  • 你正在改变EDT之外的摇摆组件,这是进入并发地狱的必然方法。

请务必遵循以下方法:

设置一个时间在所需的时间间隔内呼叫你(假设每0.1秒)。在被调用的方法中,操作组件/对象以反映新状态并调用重绘。

告诉我们是否有效。我不太确定重拍电话......可能是错的......

答案 2 :(得分:0)

有趣的是,Oracle网站上的Applet Tutorial有一个使用SwingWorkers和Timers执行动画的applet示例。也许它对你有用。

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