Java Reference
In-Depth Information
protected void save() {
int status = fc().showSaveDialog(null);
if (status == JFileChooser.APPROVE_OPTION)
{
File f = fc.getSelectedFile();
try
{
ObjectOutputStream out =
new ObjectOutputStream(
new FileOutputStream(f));
out.writeObject(/* ? */);
out.flush();
out.close();
}
catch (IOException e)
{
// explain the problem and offer to try again
}
}
}
protected JFileChooser fc()
{
if (fc == null)
{
fc = new JFileChooser();
}
return fc;
}
The
save()
method uses a
JFileChooser
dialog to determine where the user wants to
save the simulation state. The
ObjectOutputStream
class, from
java.io
, provides
the ability to write an object to disk.
CHALLENGE 19.4
What object should the
save()
method write out?
For the
save()
method to work correctly, the
MachineImage
class must implement the
Serializable
interface, and the class's persistent attributes must also be serializable. If
you inspect the code in the
visualization
package, you will find that the
MachineImage
class marks its
image
attribute as
transient
. This causes a serialization
of a
MachineImage
class to not save the
image
attribute. The class lazy-initializes its
image from the image's file name, so when a
MachineImage
object is restored, the image is
rebuilt from the original graphics file. (This requires that the image exist in the class path of
the
Visualization2
class.)
To allow users to restore a previously constructed simulation, the File menu offers a Load
item that calls a
load()
method. The
load()
method is parallel in design to the
save()
method but uses the classes
ObjectInputStream
and
FileInputStream
instead of
their
Output
counterparts to retrieve a visualization's prior state. The
load()
method
empties the
mementos
stack, pushes the retrieved memento, disables the Undo button, and
calls the
FactoryModel
class's
restore()
method: