Add an undo/redo function to your Java apps with Swing
Find out how the Swing GUI component set utilizes the Command pattern for easy support of undo/redo
By Tomer Meshorer, JavaWorld.com, 06/01/98
- Digg
- Reddit
- SlashDot
- Stumble
- del.icio.us
- Technorati
- dzone
Not too long ago, Sun's Java division introduced the JFC, a comprehensive set of UI components and foundation services that
give Java developers more flexibility to determine the look and feel of their applications. The UI component library, called
Swing, is a whole lot more than a stripped-down set of lightweight UI components. Swing takes Java applications a step forward
by allowing easy implementation of application services like undo -- the topic of our discussion today.
Historically, application frameworks (for example, MacApp framework) have based the design of the undo/redo mechanism around
the Command pattern. And that's what we're going to do as well. We'll discuss the Command pattern and describe how it supports
the design of undo/redo systems. We'll then examine Java's support for the pattern and see how Swing's undo package adds the
missing functionality, providing you with a complete undo/redo mechanism.
Requirements from an undo/redo mechanism
Undo allows users to correct their mistakes and also to try out different aspects of the application without risk of repercussions.
At minimum, an undo/redo mechanism should provide users with the ability to:
- Unexecute (undo) the last action they just performed
- Re-execute (redo) the last undone action
- Undo and redo several recent actions (preferable, but optional)
In order to design such a mechanism, we must treat the user's operations as individual atomic actions (self-contained actions that know how to undo/redo their effect on the application state) that should be stored for
undo or redo later on. We can fulfill these requirements by using design patterns, specifically the Command pattern. If you are already familiar with the design patterns (specifically the Command pattern
and how Java supports it), you can skip the next three sections and move right to "The undo/redo mechanism in Swing."
Design patterns
In a nutshell, design patterns encourage design reuse by providing established, successful design solutions for particular
situations (also known as contexts).
You may be wondering why I'm discussing design patterns in an article devoted to undo/redo mechanisms. It's really quite simple.
In addition to presenting you with the technical implementation issues, I think it's important that you understand the design
essentials of an undo/redo systems.
According to Design Patterns: Elements of Reusable Object-Oriented Software by the now infamous Gang of Four (see Resources for more information), the essential parts of any pattern are:
- Intent -- The design goal that this pattern addresses
- Applicability -- In what situation the pattern can be applied
- Structure -- The design solution to the design problem
- Consequences -- The trade-off of the solution
A number of different patterns exist, but we're concerned only with the one that addresses undo/redo capabilities: the Command pattern.
The Command pattern
Once again, according to Design Patterns, the purpose of the Command pattern is to:
Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests,
and support undoable operations.
Let's see how this works.
- Digg
- Reddit
- SlashDot
- Stumble
- del.icio.us
- Technorati
- dzone
Resources
- Download the complete source as a gzipped TAR file http://www.javaworld.com/jw-06-1998/undoredo/jw-06-undoredo.tar.gz
- Download the complete source as a ZIP file http://www.javaworld.com/jw-06-1998/undoredo/jw-06-undoredo.zip
- Read Sun's Swing applet page to find out how to run Swing applets on Netscape and Internet Explorer http://java.sun.com/products/jfc/swingdoc-current/applets.html
- Add 1.1 support to Netscape Communicator 4.0x with these step-by-step instructions for applying the 1.1 support patch http://developer.netscape.com/software/jdk/download.html
- Download the JDK 1.1 preview release for Communicator 4.05 http://developer.netscape.com/software/jdk/download.html
- Find out more about design patterns at the Pattern Web site http://hillside.net/patterns/patterns.html
- If you don't already have a copy, pick up Design Patterns Elements of Reusable Object-Oriented Software (Addison-Wesley, ISBN 0-201-63361-2) to improve your understanding of design patterns http://hillside.net/patterns/DPBook/DPBook.html
- Find out more about Unified Modeling Language at Rational Software's UML Resource Center http://www.rational.com/uml
Undo RedoBy mikeanders on December 29, 2008, 9:12 amWhere can I find a reference for the GUI standard requiring undo/redo support?
Reply | Read entire comment
View all comments