无法理解Java Swing Timers。我怎么做一次延迟?

时间:2015-01-29 08:09:09

标签: java swing timer javax.swing.timer

我需要在此计划中暂停一次,以便我尝试做什么。我在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秒,但它没有工作。

2 个答案:

答案 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

中有所体现