Wie lässt sich ein Wert nach dessen Änderung z.B. auf mehreren Textfeldern synchronisiert darstellen?
Die die Daten bereitstellende Klasse, der 'Erzähler' erweitert
die Klasse Observable. Sie stellt die Methode addObserver()
bereit, die hier im Konstruktor eine Instanz eines Observers, dem
'Zuhörer', zur Gesamtheit aller beobachtenden Objekte
hinzufügt.
Die Methode setChanged() der Klasse Observable
registriert die Veränderung des Observable-Objekts, so
dass die Methode hasChanged() true liefern würde. Der
Aufruf von notifyObservers() bewirkt nun, dass die
angemeldeten Observer, das als Parameter übergebene Objekt
geliefert bekommen und gleichzeitig die Änderung als
abgearbeitet registriert wird, sodass ein hasChanged() false
ergeben würde.
class Erzaehler extends Observable {
public Erzaehler(){
this.addObserver(new Zuhoerer_1());
this.addObserver(new Zuhoerer_2());
tell("laber, laber...");
}
public void tell(String info){
if(countObservers()>0){
setChanged();
notifyObservers(info);
}
}
}
Die beobachtenden Objekte, die Zuhörer, müssen das Interface Observer mit dessen einziger Methode update() implementieren. Sie weist zwei Argumente auf: das beobachtete Objekt und die Änderung in Form einer Object-Instanz. Im Beispiel wird ein String übergeben, der im Textfeld des 'Zuhörers' wiedergegeben wird und den ursprünglichen ersetzt.
class Zuhoerer implements Observer{
private JTextField field;
public Zuhoerer(){
JFrame frame = new JFrame();
field = new JTextField("a");
frame.add(field);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 50);
frame.setVisible(true);
}
public void update(Observable o, Object arg) {
field.setText((String) arg);
}
}
gesamter Quelltext:
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class ObserverClass {
public static void main(String[] args) {
new Erzaehler();
}
}
class Erzaehler extends Observable {
public Erzaehler(){
this.addObserver(new Zuhoerer_1());
this.addObserver(new Zuhoerer_2());
tell("hoihoi!");
}
public void tell(String info){
if(countObservers()>0){
setChanged();
notifyObservers(info);
}
}
}
class Zuhoerer_1 implements Observer{
private JTextField field1;
public Zuhoerer_1(){
JFrame frame = new JFrame("Zuhoerer 1");
field1 = new JTextField("a");
frame.add(field1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 50);
frame.setLocation(400, 400);
frame.setVisible(true);
}
public void update(Observable o, Object arg) {
field1.setText((String) arg);
}
}
class Zuhoerer_2 implements Observer{
private JTextField field2;
public Zuhoerer_2(){
JFrame frame = new JFrame("Zuhoerer 2");
field2 = new JTextField("b");
frame.add(field2);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 50);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public void update(Observable o, Object arg) {
field2.setText((String) arg);
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.