SwingStates is an extension to the Java Swing user interface toolkit that facilitates the creation of interactive applications by providing state machines to specify interactions. SwingStates also provides a powerful Canvas to create new widgets and a flexible input system to use non-standard input devices. State machines are specified directly in Java by taking advantage of the syntax of inner classes. The explosion of the number of states is contolled by allowing multiple state machines to run in parallel.