//[C] 2002 Sun Microsystems, Inc.---
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.Serializable;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class RunFactoryMethodPattern {
public static void main(String [] arguments){
System.out.println("Example for the FactoryMethod pattern");
System.out.println();
System.out.println("Creating a Contact object");
System.out.println();
Contact someone = new Contact();
System.out.println("Creating a GUI editor for the Contact");
System.out.println();
System.out.println("The GUI defined in the EditorGui class is a truly generic editor.");
System.out.println("It accepts an argument of type ItemEditor, and delegates");
System.out.println(" all editing tasks to its ItemEditor and the associated GUI.");
System.out.println(" The getEditor() Factory Method is used to obtain the ItemEditor");
System.out.println(" for the example.");
System.out.println();
System.out.println("Notice that the editor in the top portion of the GUI is,");
System.out.println(" in fact, returned by the ItemEditor belonging to the");
System.out.println(" Contact class, and has appropriate fields for that class.");
EditorGui runner = new EditorGui(someone.getEditor());
runner.createGui();
}
}
class EditorGui implements ActionListener{
private JFrame mainFrame;
private JTextArea display;
private JButton update, exit;
private JPanel controlPanel, displayPanel, editorPanel;
private ItemEditor editor;
public EditorGui(ItemEditor edit){
editor = edit;
}
public void createGui(){
mainFrame = new JFrame("Factory Pattern Example");
Container content = mainFrame.getContentPane();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
editorPanel = new JPanel();
editorPanel.add(editor.getGUI());
content.add(editorPanel);
displayPanel = new JPanel();
display = new JTextArea(10, 40);
display.setEditable(false);
displayPanel.add(display);
content.add(displayPanel);
controlPanel = new JPanel();
update = new JButton("Update Item");
exit = new JButton("Exit");
controlPanel.add(update);
controlPanel.add(exit);
content.add(controlPanel);
update.addActionListener(this);
exit.addActionListener(this);
mainFrame.addWindowListener(new WindowCloseManager());
mainFrame.pack();
mainFrame.setVisible(true);
}
public void actionPerformed(ActionEvent evt){
Object originator = evt.getSource();
if (originator == update){
updateItem();
}
else if (originator == exit){
exitApplication();
}
}
private class WindowCloseManager extends WindowAdapter{
public void windowClosing(WindowEvent evt){
exitApplication();
}
}
private void updateItem(){
editor.commitChanges();
display.setText(editor.toString());
}
private void exitApplication(){
System.exit(0);
}
}
class Contact implements Editable, Serializable {
private String name;
private String relationship;
public ItemEditor getEditor() {
return new ContactEditor();
}
private class ContactEditor implements ItemEditor, Serializable {
private transient JPanel panel;
private transient JTextField nameField;
private transient JTextField relationField;
public JComponent getGUI() {
if (panel == null) {
panel = new JPanel();
nameField = new JTextField(name);
relationField = new JTextField(relationship);
panel.setLayout(new GridLayout(2,2));
panel.add(new JLabel("Name:"));
panel.add(nameField);
panel.add(new JLabel("Relationship:"));
panel.add(relationField);
} else {
nameField.setText(name);
relationField.setText(relationship);
}
return panel;
}
public void commitChanges() {
if (panel != null) {
name = nameField.getText();
relationship = relationField.getText();
}
}
public String toString(){
return "\nContact:\n" +
" Name: " + name + "\n" +
" Relationship: " + relationship;
}
}
}
interface Editable {
public ItemEditor getEditor();
}
interface ItemEditor {
public JComponent getGUI();
public void commitChanges();
}
|