多次调用 startTimer 方法(Java)
Calling startTimer Method Multiple Times(Java)
所以我一直在浏览网页寻找答案,但感到不知所措,似乎找不到对此的解释。对于我的 类 之一,我们得到了一个示例,其中的代码与我正在使用的代码非常相似,我复制了它(我知道这很危险,但不确定该怎么做。)
我试图做到这一点,以便在按下按钮时 JLabel 读取特定文本,5 秒后该文本消失。我已经能够成功地做到这一点,但有一个陷阱。我有 6 个共享同一个 ActionListener 的 JButton,它们可以在适当的条件下调用 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只是为了调试。非常感谢任何帮助。
It does not seem like good coding practice to leave a bunch of timers running in the background
一般来说,不,如果可以的话,您不希望拥有多个 Swing Timer
s 运行ning。它们不会很好地扩展(你添加的越多,最糟糕的事情就会变得)。如果您尝试做相同或相似的事情,请尝试使用尽可能少的 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
运行ning 并且只会在 5 秒内启动一次。
so how do I stop them?
这取决于您要做什么。你可以使用 setRepeats(false)
这样计时器只会 运行 一次。您还可以使用 isRunning
检查 Timer
是否已经 运行ning 甚至使用 restart
使计时器重置,如果您想要...
How can I make the timer restart to 5 seconds everytime the button is pressed?
只需调用restart
private void startStatusTimer() {
if (!wipeOutTimer.isRunning()) {
wipeOutTimer.start();
} else {
wipeOutTimer.restart();
}
您实际上每次都可以调用 restart
,但这说明了一些您可能不知道的附加功能...
所以我一直在浏览网页寻找答案,但感到不知所措,似乎找不到对此的解释。对于我的 类 之一,我们得到了一个示例,其中的代码与我正在使用的代码非常相似,我复制了它(我知道这很危险,但不确定该怎么做。)
我试图做到这一点,以便在按下按钮时 JLabel 读取特定文本,5 秒后该文本消失。我已经能够成功地做到这一点,但有一个陷阱。我有 6 个共享同一个 ActionListener 的 JButton,它们可以在适当的条件下调用 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只是为了调试。非常感谢任何帮助。
It does not seem like good coding practice to leave a bunch of timers running in the background
一般来说,不,如果可以的话,您不希望拥有多个 Swing Timer
s 运行ning。它们不会很好地扩展(你添加的越多,最糟糕的事情就会变得)。如果您尝试做相同或相似的事情,请尝试使用尽可能少的 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
运行ning 并且只会在 5 秒内启动一次。
so how do I stop them?
这取决于您要做什么。你可以使用 setRepeats(false)
这样计时器只会 运行 一次。您还可以使用 isRunning
检查 Timer
是否已经 运行ning 甚至使用 restart
使计时器重置,如果您想要...
How can I make the timer restart to 5 seconds everytime the button is pressed?
只需调用restart
private void startStatusTimer() {
if (!wipeOutTimer.isRunning()) {
wipeOutTimer.start();
} else {
wipeOutTimer.restart();
}
您实际上每次都可以调用 restart
,但这说明了一些您可能不知道的附加功能...