计时器的嵌套

时间:2013-01-07 16:42:06

标签: java swing timer nested

此帖子与我的last帖子有关。代码块会在所需时间后将文本更改为所需的颜色。 但是,现在我想改变一个特定词的颜色,使得每个字母得到相等的时间。如果“hello”被给予1000毫秒的时间(有5个字母)那么'h''''l' 'l''''每​​个字母应该达到1000/5毫秒,即每个200毫秒。

我为此实现了摇摆计时器:

public Reminder() {

    a[0]=2000;
    a[1]=1000;
    a[2]=3000;
   a[3]=5000;
    a[4]=3000;
ActionListener actionListener = new ActionListener() {
  public void actionPerformed(ActionEvent actionEvent) {
  point =point +arr[i].length();
i++;

     doc.setCharacterAttributes(0,point+1, textpane.getStyle("Red"), true);
     timer.setDelay(a[i]);

    }
};

timer = new Timer(a[i], actionListener);
timer.setInitialDelay(0);
timer.start();

为了实现这一点,我应该在Timer内使用另一个actionListener来为特定字母提供更多时间吗?或者我应该先按.length()打破时间 然后使用计时器?我无法决定更好的方法。任何想法?

1 个答案:

答案 0 :(得分:1)

您永远不需要多个计时器。由于您事先知道所有事情应该发生的时间,只需计算这些时间,将它们放入一个列表(按时间排序)并执行每一个。

public colorize(int offset, int length) {
    long triggerTime[] = new long[length];
    long startTime = System.currentTimeMillis();
    for (int i=0; i<length; i++) {
         triggerTime[i] = startTime + (1000*i)/length;
    }

    for (int i=0; i<length; i++) {
        //just wait for the next time to occur
        Thread.sleep(triggerTime[i]-System.currentTimeMillis());
        doc.setCharacterAttributes(offset, i+1, textpane.getStyle("Red"), true);
    }
}

由于它不使用TimerTask对象,因此它可能会让您觉得非常行人,但它有效,高效且易于调试。你简单地在你想要的任何线程上调用这个方法,并且它占用整个线程,并且这个单词将以1秒内完成的速率着色。

如果你没有方便的线程,你可以制作一个调用它的计时器,但唯一的原因是访问一个线程。真正的重点是:不要设置多个计时器,只需创建一个时间值数组。满足一个事件后,设置为延迟到下一次。你永远不需要多个计时器。

如果你制作了一个代表角色着色的对象(或者你想要的任何动作)并且你将这些动作的集合放在一起,那将会更加清晰。然后按时间对整个集合进行排序。上面的循环将遍历集合,等待动作到达的时间,然后执行它。这种方法的另一个优点是你可以清除集合并终止循环。

请参阅我网站上的discussion of the overuse of timers,了解这是不好的原因。