Java计时器每次在两个值之间的随机时间

时间:2014-01-09 01:19:28

标签: java swing random timer

我有一个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();

}

我更改了名称,使其更具可读性。对象不是真正的类。

但是会发生的事情是:计时器随机运行,但它会在第一次运行的随机时间内继续运行。

因此,每次完成运行后都不会改变时间。

我怎样才能实现它,以便每次都以不同的时间运行?

2 个答案:

答案 0 :(得分:5)

问题

您的Timer仅在您的代码中构建对象时启动并随机化一次。每次TimerActionListener发送事件时,都不会调用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() ...

  • 不要停止计时器
  • 为您的下一次延迟选择一个合理的随机数。有时,这可以像创建延迟的数组或ArrayList一样简单,并随机选择其中一个。
  • 否则你可以使用random.nextInt(A + B) - B + 1来获得A和B之间的随机数。