【问题标题】:Java timer random time each time between 2 valuesJava计时器随机时间每次在2个值之间
【发布时间】:2014-01-27 09:34:30
【问题描述】:

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

}

我已更改名称以使其更具可读性 Object 不是真正的原因。

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

所以每次运行结束后它都不会改变时间。

我怎样才能让它发生,所以它每次都会以不同的时间运行?

【问题讨论】:

  • 你使用的是javax.swing.Timer还是java.util.Timer
  • 你在哪里使用Timer方法来改变它的延迟?为什么不使用这些方法?
  • @HovercraftFullOfEels 这就是我所拥有的,一切都在工作,除了它没有改变时间。
  • 你的actionPerformed()private。我认为它必须是 public 才能让您的 Timer 调用该方法。

标签: java swing random timer


【解决方案1】:

当你想改变它的延迟时间时,你应该在你的定时器的 actionPerformed 中调用setDelay(...)。这一切都可以在 Timer 的 API 中轻松找到,我建议您查看一下。


关于您的新编辑:

?newRandom()??

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

【讨论】:

  • 然后将第一个参数设置为0 ?
  • @SvenB:不,如果需要,可以随机数。
【解决方案2】:

问题

您的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() 设置定时器的新延迟并重新启动它。

这有效地做的是每次计时器触发事件​​时,它的延迟是随机的并重新启动。

希望这会有所帮助。请提出您在 cmets 中可能遇到的任何问题。

【讨论】:

  • 太棒了!很高兴我能帮上忙。
  • 是否需要停止和启动延迟,setDelay和setInitialDelay有什么区别
  • @SvenB 我认为没有必要,但我还是这样做了,而且没有什么坏处。并根据 JavaDoc heresetInitialDelay() 允许您设置开始后第一个事件之前的时间,然后setDelay() 允许您设置每个后续事件的时间。
猜你喜欢
  • 2015-04-20
  • 2023-03-11
  • 1970-01-01
  • 2019-05-31
  • 2019-11-19
  • 2015-01-22
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
相关资源
最近更新 更多