StateMachine
is the base class for all SwingStates state machines. It can handle high-level events and time out events. The following code fires a high-level virtual event to a state machine sm
:
sm.processEvent(new VirtualEvent("play"));
Any high-level event of type VirtualEvent
has a key string to identify it. This key string can be used in transitions to refer it:
sm = new StateMachine() { public State off = new State() { Transition on = new Event("play", ">> on") { }; }; public State on = new State() { Transition off = new Event("stop", ">> off") { }; }; };
Creating more advanced events can be done by deriving VirtualEvent
class. For example, we can define song events that contain the name of a song:
class SongEvent extends VirtualEvent { String songName; public SongEvent(String event, String songName) { super(event); this.songName = songName; } public String getSongName() { return songName; } }
If one fires a song event, e.g. sm.processEvent(new SongEvent("play", "mySong.mp3"))
, the title of the song can be retrieved in the transition as shown below:
public State off = new State() { Transition on = new Event("play", ">> on") { public void action() { System.out.println("play "+((SongEvent)getEvent()).getSongName()); } }; };
Each state machine contains a default timer that can be armed using method armTimer(int delay, boolean repeat)
, e.g.:
sm.armTimer(200, false);Once this method called, a time out event will occur in 200 milliseconds. This event triggers transitions of class
TimeOut
. On the example below, the player is off 200 milliseconds after having received a "stop" event:
sm = new StateMachine() { public State off = new State() { Transition on = new Event("play", ">> on") { }; }; public State on = new State() { Transition off = new Event("stop", ">> wait") { // Stop after a short delay of 200 ms public void action() { armTimer(200, false); } }; }; public State wait = new State() { Transition endDelay = new TimeOut(">> off") { }; }; };
The method armTimer
has two arguments:
repeat
is false, only one time out event will be fired in delay
milliseconds. If it is false, a time out event will be fired every delay
milliseconds until this timer is disarmed.
Although each state machine has a single default timer, it is possible to arm additional timers that are identified by a string tag. Method armTimer(String tag, int delay, boolean repeat)
arms an additional timer that also trigger TimeOut
transitions or more specific ones. A TaggedTimeOut
transition takes a string tag in its constructor and is triggered only by timers are labeled by this tag.