所以我一直在网上浏览答案,但感到不知所措,似乎无法找到解释。对于我的一个课程,我们得到了一个代码,其代码与我正在使用的代码非常相似,我将其复制(危险我知道,但不知道如何去做。)
我正在努力使它在按下按钮时JLabel读取某个文本,5秒后文本消失。我已经成功地做到了这一点,但有一个问题。我有6个JButton共享相同的ActionListener,它可以在适当的条件下调用startStatusTimer方法。
如果按下一个按钮,并在5秒内按下另一个按钮,它会启动另一个计时器,按下的按钮越多,我得到的计时器就越多,似乎永远不会停止。文本最终会消失,但只有在按下第一个按钮5秒后才会消失。
在几秒钟内多次按下按钮后,我一直在计数值> 5打印出来但由于if语句,我看不出这是怎么回事。
让一堆计时器在后台运行似乎不是一种好的编码习惯,那么如何阻止它们呢?
private void startStatusTimer()
{
ActionListener taskPerformer = new ActionListener()
{
int count=0;
public void actionPerformed(ActionEvent event)
{
count++;
System.out.println(count);
if(count>=5)
{
statusLabel.setText("");
statusTimer.stop();
}
}
};
statusTimer = new Timer(second, taskPerformer);
statusTimer.start();
}
System.out.println仅用于调试。非常感谢任何帮助。
答案 0 :(得分:0)
让一堆计时器在后台运行似乎不是一个好的编码实践
一般来说,不,你不想让多个Swing Timer
运行,如果你能提供帮助的话。它们不会很好地扩展(你添加的越多,最糟糕的事情就变成了)。如果您尝试执行相同或类似的操作,请尝试使用尽可能少的Timer
。
相反,请尝试创建Timer
...
public class ... {
private Timer wipeOutTimer;
public ...() {
wipeOutTimer = new Timer(5000, new ActionListener() {
public void actionPerformed(ActionEvent event)
{
statusLabel.setText("");
}
});
wipeOutTimer.setRepeats(false);
}
然后在startStatusTimer
中,您可以查看Timer
...
private void startStatusTimer() {
if (!wipeOutTimer.isRunning()) {
wipeOutTimer.start();
}
这将确保无论您按下按钮多少次,同时只会运行一次Timer
,并且只会在5秒钟内启动一次。
所以如何阻止它们呢?
这取决于你想要做什么。您可以使用setRepeats(false)
,因此计时器只会运行一次。您还可以使用isRunning
检查Timer
是否已在运行,如果您愿意,甚至可以使用restart
来重置计时器...
每次按下按钮,如何让计时器重启5秒?
只需致电restart
private void startStatusTimer() {
if (!wipeOutTimer.isRunning()) {
wipeOutTimer.start();
} else {
wipeOutTimer.restart();
}
您实际上每次都可以调用restart
,但这说明了一些您可能不知道的其他功能......