我有一个javax.swing.Timer需要在两个int之间的随机时间之后运行一个方法。
在创建对象之后,对象需要保持“运行”(就像继续在计时器中执行操作一样)。
我的尝试:
private int minimal = 30;
private int Max = 1000;
int randomTimeOutput;
Random randomTime;
Timer timerRunAction
public Object()
{
randomTime = new Random();
randomTimeOutput = (minimal +
randomTime.nextInt(Max - minimal + 1));
timerRunAction = new Timer(randomTimeOutput, this);
timerRunAction.start();
}
private void doSomething()
{
//Do something
}
private void actionPerformed(ActionEvent e)
{
dosomething();
}
我更改了名称,使其更具可读性。对象不是真正的类。
但是会发生的事情是:计时器随机运行,但它会在第一次运行的随机时间内继续运行。
因此,每次完成运行后都不会改变时间。
我怎样才能实现它,以便每次都以不同的时间运行?
答案 0 :(得分:5)
您的Timer
仅在您的代码中构建对象时启动并随机化一次。每次Timer
向ActionListener
发送事件时,都不会调用doSomething()
。您的计时器延迟永远不会重新随机化。
考虑以下代码:
private int minimal = 30;
private int max = 1000;
int randomTimeOutput;
Random randomTime;
Timer timerRunAction
public Object() {
randomTime = new Random();
randomTimeOutput = (minimal + randomTime.nextInt(max - minimal + 1));
timerRunAction = new Timer(randomTimeOutput, this);
timerRunAction.start();
}
private void doSomething() {
//Do something
}
private void updateTimer() {
timerRunAction.stop();
randomTimeOutput = (minimal + randomTime.nextInt(max - minimal + 1));
timerRunAction.setDelay(randomItemOutput);
timerRunAction.restart();
}
public void actionPerformed(ActionEvent e) {
dosomething();
updateTimer();
}
我添加了updateTimer()
方法,每次定时器向您的监听器发送ActionEvent
时都会调用该方法。会发生以下情况:
1-计时器“熄灭”并触发事件。
2-代码调用doSomething()
。
3-代码调用updateTimer()
。
4- updateTimer()
首先停止计时器,然后选择一个新的随机数并将其保存到randomTimeOutput
。
5- updateTimer()
设置计时器的新延迟并重新启动它。
这实际上有效的是每次定时器触发事件时,它的延迟都是随机的,然后重新启动。
希望这有帮助。请在评论中提出任何问题。
答案 1 :(得分:3)
当您想要更改其延迟时间时,应在其actionPerformed中调用计时器上的setDelay(...)
。这在Timer的API中很容易找到,我建议您查看。
关于您的新修改:
?newRandom()
...