Observer Pattern in Java 2
//[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); } } }