|   //[C] 2002 Sun Microsystems, Inc.---
 import java.awt.BorderLayout;
 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.util.ArrayList;
 import java.util.Iterator;
 
 import javax.swing.BoxLayout;
 import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextArea;
 import javax.swing.JTextField;
 
 public class RunObserverPattern {
 public static void main(String[] arguments) {
 System.out.println("Example for the Observer pattern");
 System.out.println("This demonstration uses a central observable");
 System.out.println(" object to send change notifications to several");
 System.out.println(" JPanels in a GUI. Each JPanel is an Observer,");
 System.out.println(" receiving notifcations when there has been some");
 System.out.println(" change in the shared Task that is being edited.");
 System.out.println();
 
 System.out.println("Creating the ObserverGui");
 ObserverGui application = new ObserverGui();
 application.createGui();
 }
 }
 
 class Task {
 private String name = "";
 
 private String notes = "";
 
 private double timeRequired;
 
 public Task() {
 }
 
 public Task(String newName, String newNotes, double newTimeRequired) {
 name = newName;
 notes = newNotes;
 timeRequired = newTimeRequired;
 }
 
 public String getName() {
 return name;
 }
 
 public String getNotes() {
 return notes;
 }
 
 public double getTimeRequired() {
 return timeRequired;
 }
 
 public void setName(String newName) {
 name = newName;
 }
 
 public void setTimeRequired(double newTimeRequired) {
 timeRequired = newTimeRequired;
 }
 
 public void setNotes(String newNotes) {
 notes = newNotes;
 }
 
 public String toString() {
 return name + " " + notes;
 }
 }
 
 class TaskChangeObservable {
 private ArrayList observers = new ArrayList();
 
 public void addTaskChangeObserver(TaskChangeObserver observer) {
 if (!observers.contains(observer)) {
 observers.add(observer);
 }
 }
 
 public void removeTaskChangeObserver(TaskChangeObserver observer) {
 observers.remove(observer);
 }
 
 public void selectTask(Task task) {
 Iterator elements = observers.iterator();
 while (elements.hasNext()) {
 ((TaskChangeObserver) elements.next()).taskSelected(task);
 }
 }
 
 public void addTask(Task task) {
 Iterator elements = observers.iterator();
 while (elements.hasNext()) {
 ((TaskChangeObserver) elements.next()).taskAdded(task);
 }
 }
 
 public void updateTask(Task task) {
 Iterator elements = observers.iterator();
 while (elements.hasNext()) {
 ((TaskChangeObserver) elements.next()).taskChanged(task);
 }
 }
 }
 
 interface TaskChangeObserver {
 public void taskAdded(Task task);
 
 public void taskChanged(Task task);
 
 public void taskSelected(Task task);
 }
 
 class TaskEditorPanel extends JPanel implements ActionListener,
 TaskChangeObserver {
 private JPanel controlPanel, editPanel;
 
 private JButton add, update, exit;
 
 private JTextField taskName, taskNotes, taskTime;
 
 private TaskChangeObservable notifier;
 
 private Task editTask;
 
 public TaskEditorPanel(TaskChangeObservable newNotifier) {
 notifier = newNotifier;
 createGui();
 }
 
 public void createGui() {
 setLayout(new BorderLayout());
 editPanel = new JPanel();
 editPanel.setLayout(new GridLayout(3, 2));
 taskName = new JTextField(20);
 taskNotes = new JTextField(20);
 taskTime = new JTextField(20);
 editPanel.add(new JLabel("Task Name"));
 editPanel.add(taskName);
 editPanel.add(new JLabel("Task Notes"));
 editPanel.add(taskNotes);
 editPanel.add(new JLabel("Time Required"));
 editPanel.add(taskTime);
 
 controlPanel = new JPanel();
 add = new JButton("Add Task");
 update = new JButton("Update Task");
 exit = new JButton("Exit");
 controlPanel.add(add);
 controlPanel.add(update);
 controlPanel.add(exit);
 add.addActionListener(this);
 update.addActionListener(this);
 exit.addActionListener(this);
 add(controlPanel, BorderLayout.SOUTH);
 add(editPanel, BorderLayout.CENTER);
 }
 
 public void setTaskChangeObservable(TaskChangeObservable newNotifier) {
 notifier = newNotifier;
 }
 
 public void actionPerformed(ActionEvent event) {
 Object source = event.getSource();
 if (source == add) {
 double timeRequired = 0.0;
 try {
 timeRequired = Double.parseDouble(taskTime.getText());
 } catch (NumberFormatException exc) {
 }
 notifier.addTask(new Task(taskName.getText(), taskNotes.getText(),
 timeRequired));
 } else if (source == update) {
 editTask.setName(taskName.getText());
 editTask.setNotes(taskNotes.getText());
 try {
 editTask
 .setTimeRequired(Double.parseDouble(taskTime.getText()));
 } catch (NumberFormatException exc) {
 }
 notifier.updateTask(editTask);
 } else if (source == exit) {
 System.exit(0);
 }
 
 }
 
 public void taskAdded(Task task) {
 }
 
 public void taskChanged(Task task) {
 }
 
 public void taskSelected(Task task) {
 editTask = task;
 taskName.setText(task.getName());
 taskNotes.setText(task.getNotes());
 taskTime.setText("" + task.getTimeRequired());
 }
 }
 
 class TaskHistoryPanel extends JPanel implements TaskChangeObserver {
 private JTextArea displayRegion;
 
 public TaskHistoryPanel() {
 createGui();
 }
 
 public void createGui() {
 setLayout(new BorderLayout());
 displayRegion = new JTextArea(10, 40);
 displayRegion.setEditable(false);
 add(new JScrollPane(displayRegion));
 }
 
 public void taskAdded(Task task) {
 displayRegion.append("Created task " + task + "\n");
 }
 
 public void taskChanged(Task task) {
 displayRegion.append("Updated task " + task + "\n");
 }
 
 public void taskSelected(Task task) {
 displayRegion.append("Selected task " + task + "\n");
 }
 }
 
 class TaskSelectorPanel extends JPanel implements ActionListener,
 TaskChangeObserver {
 private JComboBox selector = new JComboBox();
 
 private TaskChangeObservable notifier;
 
 public TaskSelectorPanel(TaskChangeObservable newNotifier) {
 notifier = newNotifier;
 createGui();
 }
 
 public void createGui() {
 selector = new JComboBox();
 selector.addActionListener(this);
 add(selector);
 }
 
 public void actionPerformed(ActionEvent evt) {
 notifier.selectTask((Task) selector.getSelectedItem());
 }
 
 public void setTaskChangeObservable(TaskChangeObservable newNotifier) {
 notifier = newNotifier;
 }
 
 public void taskAdded(Task task) {
 selector.addItem(task);
 }
 
 public void taskChanged(Task task) {
 }
 
 public void taskSelected(Task task) {
 }
 }
 
 class ObserverGui {
 public void createGui() {
 JFrame mainFrame = new JFrame("Observer Pattern Example");
 Container content = mainFrame.getContentPane();
 content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
 TaskChangeObservable observable = new TaskChangeObservable();
 TaskSelectorPanel select = new TaskSelectorPanel(observable);
 TaskHistoryPanel history = new TaskHistoryPanel();
 TaskEditorPanel edit = new TaskEditorPanel(observable);
 observable.addTaskChangeObserver(select);
 observable.addTaskChangeObserver(history);
 observable.addTaskChangeObserver(edit);
 observable.addTask(new Task());
 content.add(select);
 content.add(history);
 content.add(edit);
 mainFrame.addWindowListener(new WindowCloseManager());
 mainFrame.pack();
 mainFrame.setVisible(true);
 }
 
 private class WindowCloseManager extends WindowAdapter {
 public void windowClosing(WindowEvent evt) {
 System.exit(0);
 }
 }
 }
 
 
 
 
 
 
 |