//[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);
}
}
}