我将演示我想使用代码实现的目标。
创建计时器参考Timer timer;
构造和初始化计时器
timer = new Timer(duration, timerAction);
timer.start();
现在
timerListener
AbstractAction timerAction = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
//Perform some action for duration
jlabel.setText("A"); //action_1
//See description under code
jlabel.setText("B"); // action_2
}
};
寻求的方案:
动作_1的持续时间与动作_2的持续时间不同
持续执行动作_1(例如持续时间_1)
在持续时间为_1的动作_1完成后
持续时间_2执行动作_2
在持续时间_2完成动作_2之后
持续时间_1,执行动作_1
等等。
仅在action_2完成间隔之后,action_1才会执行其后续间隔。
仅在action_1完成间隔之后,action_2才会执行其后续间隔。
在示例中进行描述:让我们执行以下操作
jlabel.setText("A"); //action_1
jlabel.setText("B"); // action_2
动作_1的持续时间与动作_2的持续时间不同
动作_1:将文本设置为“ A”,持续时间为1秒。
执行action_1 1秒后
action_2:将文本设置为“ B”,持续2秒
执行action_2 2秒后
动作_1:将文本设置为“ A”,持续时间为1秒
等等。
仅在action_2完成间隔之后,action_1才会执行其后续间隔。
仅在action_1完成间隔之后,action_2才会执行其后续间隔。
....
关于如何实现它的任何想法?
最佳答案
也许是这样的:
public class DoubleActionTimer {
private final Action action1;
private final Action action2;
private final int delay1;
private final int delay2;
private final Timer timer;
private DoubleActionTimer(Action action1, int delay1, Action action2, int delay2) {
this.timer = new Timer(delay1, new ActionSwitcher());
this.action1 = action1;
this.delay1 = delay1;
this.action2 = action2;
this.delay2 = delay2;
this.timer.setRepeats(false);
this.timer.start();
}
public void stop() {
this.timer.stop();
}
private class ActionSwitcher extends AbstractAction {
private boolean flag = false;
/**
* Invoked when an action occurs.
*/
@Override
public void actionPerformed(ActionEvent e) {
final Action action = flag?action2:action1;
final int delay = flag?delay1:delay2;
flag = !flag;
action.actionPerformed(e);
timer.setInitialDelay(delay);
timer.start();
}
}
public static void main(String[] args) throws InterruptedException {
final Action action1 = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Action1"+new Date());
}
};
final Action action2 = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Action2 "+new Date());
}
};
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new DoubleActionTimer(action1, 500, action2, 3000);
}
});
TimeUnit.SECONDS.sleep(60);
}
}
关于java - 如何使用计时器以两个不同的间隔/持续时间执行两个不同的 Action ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18388713/