import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class MVCDemo2 {
public static void main(String[] args) {
new MVCDemo2().new Controller().createWindow();
}
class Controller implements ActionListener {
private Model model;
private View view;
public Controller() {
model = new Model(); //neues Model wird erzeugt
view = new View(model); //neue View wird erzeugt und erhält gleichzeitig das Model
view.addListener(this); //Registrierung des Controllers als Beobachter der View
}
public void createWindow() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(0, 0, 500, 300);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(view);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent evt) { // Implementierung der Listener Methode
if (evt.getActionCommand().equals("action1"))
model.setValueAt(1, model.getValueAt(0));
else if (evt.getActionCommand().equals("action2"))
model.setValueAt(0, model.getValueAt(1));
}
}
class View extends JPanel implements ModelObserver {
private Model model;
private JButton button1, button2;
private JTextField field1, field2;
private JLabel label;
public View(Model model) {
this.setLayout(new GridLayout(5, 1, 10, 10));
this.model = model;
this.model.addObserver(this); // Registrierung der View als Beobachter des Models
this.add(field1 = new JTextField(model.getValueAt(0)));
this.add(button1 = new JButton("Copy 1 To 2"));
this.add(field2 = new JTextField(model.getValueAt(1)));
this.add(button2 = new JButton("Copy 2 To 1"));
this.add(label = new JLabel("", JLabel.RIGHT));
button1.setActionCommand("action1");
button2.setActionCommand("action2");
}
public void modelChanged(int index) { // Implementierung der Observer Methode
label.setText("Feld " + (index+1) + " wurde geändert ");
switch (index) {
case 0:
field1.setText(field2.getText());
break;
case 1:
field2.setText(field1.getText());
break;
}
}
public void addListener(ActionListener listener) {
button1.addActionListener(listener);
button2.addActionListener(listener);
}
}
class Model {
private ArrayList<ModelObserver> observerList;
private String[] value;
public Model() {
observerList = new ArrayList<ModelObserver>();
value = new String[] { "Wert1", "Wert2" };
}
public void addObserver(ModelObserver observer) {
this.observerList.add(observer);
}
public String getValueAt(int index) {
if (index >= this.value.length)
throw new IllegalArgumentException("Invalid index: " + index
+ " --> max index: " + this.value.length);
return value[index];
}
public void setValueAt(int index, String value) {
if (index >= this.value.length)
throw new IllegalArgumentException("Invalid index: " + index
+ " --> max index: " + this.value.length);
this.value[index] = value;
this.fireModelChanged(index);
}
private void fireModelChanged(int index) {
for (int i = 0; i < observerList.size(); i++)
observerList.get(i).modelChanged(index);
}
}
/**
* Observer Interface, welches jede Klasse, die über Änderungen des Models informiert
* werden will implementieren muss
*/
interface ModelObserver {
public void modelChanged(int index);
}
}