此帖子与我的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()
打破时间
然后使用计时器?我无法决定更好的方法。任何想法?
答案 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,了解这是不好的原因。