Observer Pattern: feuern bei neuer Referenz-Zuweisung?

A

Alex77

Mitglied
Angenommen die Klasse 'Spiel' verfügt über einen PropertyChangeSupport (ist also Observable).
Bei jeder Veränderung eines Members wird gefeuert (das ist das Pattern).
Aaaber ist es auch möglich zu feuern, wenn z.B. folgendes passiert:

Spiel s1 = new Spiel();
Spiel s2 = new Spiel();
s2 = s1; // kann hier automatisch gefeuert werden??? Oder geht das nur, wenn ich einen Wrapper benutze, der als
// einzigen Member Spiel hat und selbst Observable ist?
 
S

SlaterB

Gast
bedenke wer hier PropertyChangeSupport ist, wo sich Observer angemeldet haben, in Listen enthalten sind um sie zu informieren,
wenn das alles in einem Spiel-Objekt enthalten ist, dann ist ein anderes Spiel doch was völlig anderes, kennt keinen der alten Observer usw.,

ein Wrapper scheint das Ziel zu sein, ja
 
A

Alex77

Mitglied
@SlaterB
Vielen Dank für die schnelle Antwort. Hm, ich beschäftige mit dem Pattern seit Wochen und immer wenn ich denke, dass ich alles verstand, kommt wieder das Gefühl nichts verstanden zu haben *lach* Oder ich bin einfach manchmal zu tief drin und sehe den Wald vor lauter Bäumen nicht mehr.

Letztlich habe ich nur folgendes alltägliches Problem:
Benutzer klickt auf den Button "Spiel laden" und die Variable des alten Spiels soll überschrieben werden. Da andere Klassen eine Referenz vom alten Spiel nutzen, sollen diese Klassen aktualisiert werden.

Oder ganz einfach gesagt: Wie teile ich dann z.B. einem Textfield und einer JTable mit, dass jetzt nach dem Laden neue Daten angezeigt werden sollen?
 
M

Michael...

Top Contributor
Oder ganz einfach gesagt: Wie teile ich dann z.B. einem Textfield und einer JTable mit, dass jetzt nach dem Laden neue Daten angezeigt werden sollen?
In dem diese als "Observer" an den Daten bzw. dem Datenmodel registriert werden.
Bei der JTable ist das bereits implementiert, die hängt ja an ihrem TableModel
 
S

SlaterB

Gast
eine JTable hat eine Art Wrapper für die Daten, ein TableModel,
dort kann man setNewData() aufrufen und das (gleichgebliebene) Model berichtet seinem altbekannten Observer, der JTable

erstellt man dagegen ein neues Model muss man manuell
jTable.setModel(newModel);
aufrufen, damit die neuen Strukturen initialisiert werden (JTable meldet sich neu als Observer am neuen Model an)
 
A

Alex77

Mitglied
@Michael + SlaterB
Vielen Dank für Eure Antworten. Ich muss jetzt mal in die Stadt und schaue dann nachher mal, ob ich das so umsetzen kann mit dem TableModel der JTable.
 
A

Alex77

Mitglied
Ist jetzt leider einiges zu lesen für Euch. Aber ich wäre Euch echt dankbar, wenn ihr Euch das antut und meine 3 Fragen dazu beantworten würdet.

Habe mal an ein Modelprogramm gemacht. Statt eines TableModels weise ich der Table über einen Vector<Vector<Integer>> die Daten direkt zu (war für mich jetzt schneller zu machen).

Erklärung:
Zuerst die Klasse Spiel, die Dummy-Daten in Form eines Vector<Integer> mit 'getZahlen' und 'setZahlen' bereitstellt. In setZahlen wird firePropertyChange(..) ausgelöst.
Dieses wird empfangen von einem zuvor der Klasse Spiel zugewiesen AlexTableListener. Dieser schreibt die neuen Daten in die Tabelle.

Fragen:
1. Meintet Ihr das so mit dem Observer für die Klasse Spiel?
2. Sollte ich doch lieber ein AbstractTableModel verwenden? Im Moment sehe ich keinen Vorteil.
3. Ich habe PropertyChangeSupport der Klasse Spiel als Member zugewiesen. Ist das sinnvoll, oder doch lieber ableiten und 'extends PropertyChangeSupport' verwenden?

Java:
class Spiel {
    private  Vector<Integer> zahlen = new Vector<Integer>(); // Der eigentliche Inhalt der Klasse
    public PropertyChangeSupport propChange = new PropertyChangeSupport(this); 
    public static final String UPDATE = "update"; // String für firePropertyChange(..)
    Spiel() {
    }
    public Vector<Integer> getZahlen() { // hierüber holt sich AlexTableListener die Daten
        return zahlen;
    }
    public void setZahl(int i){   // in main() werden hiermit 2 Mal Neue Daten erzeugt, die in der Tabelle
// aktualisiert angezeigt werden.
        zahlen.removeAllElements();
        zahlen.add(i*2);
        zahlen.add(i*3);
        propChange.firePropertyChange(UPDATE, null, this); // übergebe Veränderungen
        // an AlexTableListener weiter
    }
}
public class NewJFrame extends javax.swing.JFrame {
    // .... sonstiger Code für JFrame stünde hier.....
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true); // siehe ein paar Zeilen tiefer
            }
        });
    }

    private javax.swing.JScrollPane jScrollPane;
    private javax.swing.JTable jTable;

    public NewJFrame() {
        initComponents();
        Spiel spiel = new Spiel();  // ################### Hier geht es los 
        spiel.propChange.addPropertyChangeListener(
                new AlexTableListener(jTable, jScrollPane));
        spiel.setZahl(2); // In Tabelle die Zahlen: 4 und 6
        spiel.setZahl(5); // In Tabelle die Zahlen: 10 und 15

    }
}

class AlexTableListener implements PropertyChangeListener {
    private JTable table;
    private JScrollPane scrollpane; // ohne scheint kein repaint() möglich zu sein.
    
    public AlexTableListener(JTable table, JScrollPane scrollpane) {
        this.table = table;
        this.scrollpane = scrollpane;
    }
    public void propertyChange(PropertyChangeEvent evt) {
        if(evt.getNewValue() instanceof Spiel) { // ist das Event von Klasse Spiel?
            Spiel spiel = (Spiel)evt.getNewValue(); // neues Spiel durch firePropertyChange(..)
            Vector<Vector<Integer>> vec = new Vector<Vector<Integer>>(); // hier kommen die Tabellendaten rein
            vec.add(spiel.getZahlen()); // neue Zahlen holen
            Vector<String> head = new Vector<String>(); // Tabellen Kopfleiste
            head.add("Zahl1"); head.add("Zahl2"); // Tabellen Kopfleiste
            table = new JTable(vec, head); // Inhalt zufügen
            scrollpane.setViewportView(table); // Vorbereiten des Repaints.
            scrollpane.repaint(); // Neue Tabelle ausgeben
        }
    }
}
 
S

SlaterB

Gast
> 1. Meintet Ihr das so mit dem Observer für die Klasse Spiel?

sieht nach einer lauffähigen Variante aus, was für einen Aufbau du wählst ist dir aber ganz überlassen,
da wollte sicher keiner reinreden

> 3. Ich habe PropertyChangeSupport der Klasse Spiel als Member zugewiesen. Ist das sinnvoll, oder doch lieber ableiten und 'extends PropertyChangeSupport' verwenden?

nein, das extends brächte dir nur wenig Vorteile, etwa
> spiel.addPropertyChangeListener(..)
statt
> spiel.propChange.addPropertyChangeListener(..)
dafür wäre die Möglichkeit einer anderen Oberklasse verbaut,
bisher stehen wenig Vorteile gar keinem Nachteil gegenüber, da du sowieso keine andere Oberklasse hast,
allgemein ist aber ein Klassenattribut organisatorisch sauberer als eine Vererbung

> 2. Sollte ich doch lieber ein AbstractTableModel verwenden? Im Moment sehe ich keinen Vorteil.

schlecht ist auf jeden Fall new JTable(), solch ein Konstrukt kann schon mal MB an Speicher belegen und der ganze Austausch eine Sekunde dauern,
GUI-Komponenten wenn möglich nie ersetzen, aller höchsten zwischen mehreren Sichten hin- und herschalten

in diesem Fall ginge wahrscheinlich auch ohne eigenes Model
> DefaultTableModel model = (DefaultTableModel) table.getModel();
> model.setDataVector(vec, head);

fertig, nix zu scrollen oder sonst wie zu repaint(), das passiert automatisch, soweit nötig,
oder sonst ein neues Model erzeugen und in die Table setzen,
schlecht wäre in diesen Fällen nur, wenn überhaupt nirgendwo je eine JTable erzeugt wird..

wenn die Daten fertig als Vector vorliegen, brauchst du nicht unbedingt ein eigenes Model, richtig
 
A

Alex77

Mitglied
@SlaterB
Herzlichen Dank für Deine ausführlichen Antworten zu allen drei Punkten.
Besonders der Punkt, dass ein '= new JTable(..)' zu Laufzeitproblemen führen kann, war mir nicht bewusst. Daher besonderen Dank für den DefaultTableModel Tipp. Und ich spare mir einen Parameter im Konstruktor wegen des Wegfalls der ScrollPane. Toll.

Dann werde ich mich erst einmal auch nicht mit dem TableModel beschäftigen. Sah mir doch etwas zeitaufwendig aus. In der Tat liegen meine Daten alle als Vectoren, Maps oder LinkedLists vor. Sollte also für das jetzige Programm reichen.

Noch mal vielen Dank!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
GreenTeaYT Verstehe nicht ganz das Observer Pattern in einer Arrayliste? Allgemeine Java-Themen 3
K Verständnisprobleme bei Observer-Pattern mit größerem Datenmodell Allgemeine Java-Themen 32
U Verständnisschwierigkeiten Observer Pattern Allgemeine Java-Themen 18
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
N Observer Pattern Allgemeine Java-Themen 2
G problem mit dem observer pattern Allgemeine Java-Themen 3
G Frage zum Observer Pattern Allgemeine Java-Themen 4
S OOP JFrame als Observer eines JPanel Allgemeine Java-Themen 3
A Observer und Initialisierung Allgemeine Java-Themen 7
L Registrierung von Observer Allgemeine Java-Themen 4
G 2 Observable und ein Observer... Allgemeine Java-Themen 4
M MVC: PropertyChangeListener vs Java Observer & Observable Allgemeine Java-Themen 11
S Wie kann ein Observer mehrere Observables beobachten? Allgemeine Java-Themen 9
Z Observer/Observable & Grundlagen Allgemeine Java-Themen 6
R Observer Umsetzungsproblem Allgemeine Java-Themen 7
nrg Java Observer in SysTray laufen lassen / Console schließen Allgemeine Java-Themen 2
T Observer vs Listener Allgemeine Java-Themen 18
V Threads und Observer Allgemeine Java-Themen 18
H Observer und Observable Allgemeine Java-Themen 3
B Observer vs Listener (GUI-Programmierung) Allgemeine Java-Themen 5
M Observer serialisieren Allgemeine Java-Themen 7
G Observer / Observable oder doch lieber Message Broker? Allgemeine Java-Themen 2
P Observer/TimerTask Allgemeine Java-Themen 3
P Observer Allgemeine Java-Themen 4
N Observer/Observable der JAVA-API od. eigene Implementierung Allgemeine Java-Themen 2
B Observer reagieren beim 2ten mal nicht Allgemeine Java-Themen 23
P Observer, nicht alle updates bearbeiten Allgemeine Java-Themen 2
P Abmelden beim Observer Allgemeine Java-Themen 4
M Frage zu update Methode von Observer! Allgemeine Java-Themen 40
lhein Tutorial zu Observer / Observable? Allgemeine Java-Themen 6
S Observable und Observer Allgemeine Java-Themen 10
G Frage zu (mehrfachem) Observable/Observer Allgemeine Java-Themen 2
Meeresgott Best Practice "Spezifisches" Factory Pattern ? Allgemeine Java-Themen 1
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
M Vaadin MVP Pattern Allgemeine Java-Themen 1
N Java MVC Pattern richtig anwenden Allgemeine Java-Themen 24
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
B MVC-Pattern größeres Beispiel Allgemeine Java-Themen 16
L Erste Schritte Java Date Format Pattern bestimmten Allgemeine Java-Themen 2
D Pattern mit Pattern vergleichen Allgemeine Java-Themen 3
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Hilfe bei geeignetem Pattern (Decorierer) Allgemeine Java-Themen 2
F Welches Design Pattern? Allgemeine Java-Themen 3
J Pattern aus String entfernen Allgemeine Java-Themen 2
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
Rudolf State Pattern als Enum? Allgemeine Java-Themen 10
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3
Guybrush Threepwood Pattern gesucht: Punkt ohne Leerzeichen dahinter Allgemeine Java-Themen 3
turmaline OOP Decorater Pattern für Varifikationsverhalten Allgemeine Java-Themen 13
T HTML Tag Position mittels Pattern ermitteln Allgemeine Java-Themen 7
X Datentypen Prozentualer Abgleich zwischen 2 Strings (Pattern?) Allgemeine Java-Themen 3
H Pattern.compile Syntax Allgemeine Java-Themen 15
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
T Pattern für Benutzer-Gruppen, RMI Allgemeine Java-Themen 5
E Super erzwingen, konzept/pattern gesucht. Allgemeine Java-Themen 8
H Problem mit der Klasse Pattern - Regulärer Ausdruck Allgemeine Java-Themen 2
Eldorado Meinung zu einem abgewandelten MVC-Pattern Allgemeine Java-Themen 2
R Matcher - Pattern mit belibigem Anfang Allgemeine Java-Themen 2
H Bestimmten String mit Pattern und Matcher herauslesen => kein erfolg Allgemeine Java-Themen 9
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
I Template Method pattern mit "geschützten Methoden" Allgemeine Java-Themen 5
T Pattern: Passive View Allgemeine Java-Themen 2
T Pattern: Greedy, Reluctant, Possessive Allgemeine Java-Themen 4
S Hilfe bei Pattern Allgemeine Java-Themen 5
N Registry Pattern Allgemeine Java-Themen 7
Tandibur Denkfehler bei Pattern.matches? Allgemeine Java-Themen 3
Tandibur pattern dynamisch vorkompilieren Allgemeine Java-Themen 9
N Pattern Allgemeine Java-Themen 11
Iron Monkey Pattern - Matcher - Problem Allgemeine Java-Themen 3
jmar83 welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
H2SO3- String(pattern) von SimpleDateFormat auslesen Allgemeine Java-Themen 7
M Problem mit Pattern Allgemeine Java-Themen 3
N Welches design pattern? Allgemeine Java-Themen 8
B Pattern gesucht, Programm Optionen, Casten vermeiden Allgemeine Java-Themen 3
D Welches Pattern kann ich nutzen? Allgemeine Java-Themen 9
J Suche regex-Pattern fuer Liste von Zahlen zwischen 0-100 Allgemeine Java-Themen 6
G Sequenzdiagramm Dao Pattern Allgemeine Java-Themen 3
S regex-Pattern Ausdruck negieren Allgemeine Java-Themen 2
J Pattern eines Textes Allgemeine Java-Themen 4
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
Y Pattern Problem Allgemeine Java-Themen 2
G UML-Diagramme mit DAO Pattern Allgemeine Java-Themen 7
S Pattern regex Allgemeine Java-Themen 2
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
J Regex Pattern Problem Allgemeine Java-Themen 12
P MVC Pattern Allgemeine Java-Themen 31
C Pattern für Kommunikation gesucht Allgemeine Java-Themen 3
G Frage zu MVC Pattern Allgemeine Java-Themen 6
J Pattern und Regex Allgemeine Java-Themen 2
L Wie Pattern anwenden um Cipher zu nutzen Allgemeine Java-Themen 2
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3

Ähnliche Java Themen

Anzeige

Neue Themen


Oben