我需要在此计划中暂停一次,以便我尝试做什么。我在Java Swing JFrame
中显示一些文本,重新显示它,我等待1.5秒,然后我更改文本。
基本上,我从这开始:
statusLabel.setText(s);
appFrame.repaint();
Thread.sleep(1500);
statusLabel.setText(y);
appFrame.repaint();
但这不起作用。重绘完成之前会调用Thread.sleep()
,这意味着永远不会显示s。我读了很多你不应该在swing应用程序中使用Thread.sleep()
的地方,因为它会暂停所有线程,甚至是尝试重绘的线程,以及暂停由actionPerformed()
触发的内容需要使用Java Swing Timer。
这一切都很好,除了我找不到一个可以解释它们如何工作的单一地方。因为,据我所知,定时器专门用于在计时器上重复事件。我只想在2次重绘之间延迟1.5秒。
我试过这样做......
statusLabel.setText(s);
appFrame.repaint();
Timer timer = new Timer(1500, new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
}
});
timer.setInitialDelay(1500);
timer.setRepeats(false);
timer.start();
statusLabel.setText(y);
appFrame.repaint();
...添加一个具有1.5秒初始延迟的计时器,没有重复,并且没有身体进行其actionPerformed事件,因此它实际上什么都不做,只是等待1.5秒,但它没有工作。
答案 0 :(得分:3)
在您的示例中编码,看起来计时器会工作",它只是没有做任何事情,因为actionPerformed
方法是空的。你可能会认为timer.start()
阻塞并等待定时器触发,但实际上它会立即返回。定时器的工作方式是定时器的actionPerformed
方法将在应用时从UI线程调用。将代码放在计时器的actionPerformed
方法中是定期更新UI状态的好方法。
答案 1 :(得分:1)
您是否尝试将statusLabel.setText(y);
置于actionPerformed
的{{1}}方法中?
ActionListener
如果仍然无效,请考虑提供一个runnable example来证明您的问题。这将减少混淆和更好的响应
<强>更新强>
你似乎想做什么,是设置了一系列在不同时间触发的事件......而不是使用单独的statusLabel.setText(s);
Timer timer = new Timer(1500, new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
statusLabel.setText(y);
}
});
timer.setRepeats(false);
timer.start();
,你应该使用一个{{1像一个循环,每次滴答时,你检查它的状态并做一些应该做什么的决定,例如......
Timer
现在,如果你想做一些非常有趣的事情,你可以在一段时间内设计一系列关键帧。
这意味着您可以更改动画的持续时间,而无需更改任何其他代码,例如......
Timer
更先进的概念,在this answer
中有所体现