0

这篇文章与我的一篇文章有​​关。代码块在所需时间后将文本更改为所需的颜色。但是,现在我想更改特定单词的颜色,以便每个字母获得相同的时间。例如,如果“你好”的时间为 1000 毫秒(有 5 个字母),那么 'h''e''l' 'l''o' 每个字母应该得到 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() 然后使用计时器?我无法决定更好的方法。有什么想法吗?

4

1 回答 1

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 秒内完成的速度着色。

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

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

请参阅我的网站上关于过度使用计时器的讨论,以了解为什么这是不好的。

于 2013-01-15T05:34:01.387 回答