invokeLater() vs synchronized(Object)

Status
Nicht offen für weitere Antworten.

-frank

Bekanntes Mitglied
folgendes möchte ich für mein programm sicherstellen:
1. nicht mehrere useraktionen gleichzeitig.
2. keine aktionen während gui-aktualisierung.
3. keine aktualisierung während einer aktion.

derzeit synchronisiere ich mit einem simplen objekt, auf das eben synchronized zugegriffen wird. das bedeutet, dass zb ein mouseClicked(..) synchronisierten zugriff auf das objekt benötigt und nicht parallel zu einem actionPerformed(..) abgearbeitet werden kann.
ich frage mich jetzt, wie ich es mit der model/gui-aktualisierung halte. am einfachsten erscheint es mir, wenn man schon VOR der modelaktualisierung ebenfalls zugriff auf das zentrale synchobjekt benötigt. andererseits erscheint es mir sehr falsch, dass der view einfluss darauf hat, wann das model (von außen) aktualisiert werden darf.
folglich sollte ich die synchronisation wohl erst in den update-methoden der GUI machen oder? hätte es hier nun Vorteile, dies mit SwingUtilities.invokeLater() bzw. invokeAndWait() zu lösen?

natürlich kann es dann sein, dass sich die Daten im Model parallel zur Ausführung einer vom User (über die GUI) ausgelösten Aktion verändern (das Model kann in meinem Fall wie gesagt von anderer Stelle aus auch modifiziert werden): zb könnte ein GUI-Objekt, mit dem der User etwas tun möchte, im Model bereits entfernt worden sein (in der GUI aber eben noch nicht). Ist es üblich, dass man die Fehlerbehandlung dafür in den Controller packt? (und dann in der GUI ggf. Fehlermeldungen anzeigen lässt?)
 

Wildcard

Top Contributor
Simultane GUI Aktionen sind technisch gar nicht möglich, eine Synchronisation daher unnötig.
Alle Events werden in eine Queue gepackt und sequentiell abgearbeitet.
invokeLater brauchst du genau dann wenn ein anderer Thread als der AWT Event Dispatcher Thread direkt oder indirekt die GUI beinflusst. Dieser Teil des Codes muss dann mit invokeLater in die Queue geschoben werden um vom Dispatcher Thread abgearbeitet zu werden.
 
G

Guest

Gast
Wildcard hat gesagt.:
invokeLater brauchst du genau dann wenn ein anderer Thread als der AWT Event Dispatcher Thread direkt oder indirekt die GUI beinflusst.

eine indirekte GUI beeinflussung habe ich durch eine Veränderung der Daten im Modell. angenommen im Model steht, dass es einen Kreis gibt mit 100pixel radius und farbe blau. dann wird das model von außen geändert und die farbe des kreises dadurch auf rot gesetzt. das model informiert alle listener --> listener.stateChanged().

in stateChanged() gibts dann entweder etwas in der Richtung jTextField.setText(model.getXY()) oder auch nur ein repaint().

wo bräuchte ich nun das invokeLater()? in der stateChanged()-Methode?
ist es auch bei einem repaint() notwendig? (das schreibt doch den repaint bzw. update-befehl auch nur in den awtthread oder?)
 

-frank

Bekanntes Mitglied
Wildcard hat gesagt.:
Anonymous hat gesagt.:
wo bräuchte ich nun das invokeLater()? in der stateChanged()-Methode?
Die Änderung des Models sollte über invokeLater erfolgen.

das verstehe ich nicht. sollte/muss das model ein objekt sein, das sich zwar auf mehrere gui-objekte (views) aber nur auf eine GUI, also einen AWT-Thread und vor allem auch nur auf das UserInterface bezieht?
ich hatte es mir nämlich so vorgestellt, dass dasselbe Objekte, das XYModel (für meinen XYView) implementiert, zb auch Daten für ein ganz anderes Nicht-GUI Objekt liefern könnte (die Daten wären ja dieselben, eventuell bräuchte ich nur andere Methoden oder vielleicht nicht mal das). Zb könnte eine andere Klasse die Daten prüfen und bei bestimmten Zuständen eine aktion auslösen. eventuell könnte es auch ganz andere programme geben, die zb über sockets mit dem model kommunizieren.
das model wäre dann ne art server, der view nur ein client (von vielen). und aus dieser sicht scheints mir total verkehrt, wenn ein (blockierender) client ein update des servers verhindert.
--> sollte man das Model wirklich nur für Views nurtzen? (also sollte ich nicht einfach eine Klasse, die zb ne Art Datenbank für viele andere Objekte/Programme darstellt), direkt XYModel implementieren lassen?)

(ich glaub ich muss nochmal im Netz stöbern, um mich besser in diesen Thema einlesen zu können)
 

Wildcard

Top Contributor
das verstehe ich nicht. sollte/muss das model ein objekt sein, das sich zwar auf mehrere gui-objekte (views) aber nur auf eine GUI, also einen AWT-Thread und vor allem auch nur auf das UserInterface bezieht?
Es gibt nur einen einzigen AWT-Thread, jede GUI läuft in dem gleichen.

Das Model über invokeLater zu ändern ist die einfachste, aber nicht die einzige Möglichkeit.
Du musst folgende Bereiche abdecken:
-Thread x ändert das Model -> View wird über Listener aktualisiert -> Aktualisierung der View muss im Dispatcher Thread erfolgen

-Thread x ändert das Model während die GUI gerade Werte aus dem Model abfragt (aus eigener Initiative heraus) -> auch hier muss synchronisiert werden.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
Ollek Swing SwingUtilities invokeLater und invokeAndWait AWT, Swing, JavaFX & SWT 4
X Swing GUI-Änderungen mit invokeLater AWT, Swing, JavaFX & SWT 4
B Swing invokeLater nötig beim GUI erstellen? AWT, Swing, JavaFX & SWT 10
W Swing SwingUtilities.invokeLater wie konsequent anwenden? AWT, Swing, JavaFX & SWT 3
Dit_ SwingUtilities.invokeLater und Modaler JDialog AWT, Swing, JavaFX & SWT 11
Dit_ Frage zum Thema SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 5
H invokeLater Problem AWT, Swing, JavaFX & SWT 8
I Swing Wann invokeLater() verwenden? AWT, Swing, JavaFX & SWT 7
G Frage zu SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 16
E einfache Frage zu invokeLater() AWT, Swing, JavaFX & SWT 4
G Frage zu SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 9
G Schachtelung bei invokeLater AWT, Swing, JavaFX & SWT 4
B SwingUtilities.invokeLater() AWT, Swing, JavaFX & SWT 12
T invokeLater - Wann? AWT, Swing, JavaFX & SWT 29
L invokeLater in der main-Methode AWT, Swing, JavaFX & SWT 6
D GUI in JFrame mit invokeLater verändern AWT, Swing, JavaFX & SWT 5
M GUI in Verbindung mit invokeLater() bzw. invokeAndWait() AWT, Swing, JavaFX & SWT 2
R Java threads und synchronized AWT, Swing, JavaFX & SWT 15
G Problem mit Swing und synchronized AWT, Swing, JavaFX & SWT 3
K TableView: 'Komplexes' Object AWT, Swing, JavaFX & SWT 11
S 3D-Grafik Marker zu aus Screen anvisiertem Object AWT, Swing, JavaFX & SWT 1
Paul15 ActionListen auf Object in main AWT, Swing, JavaFX & SWT 7
L Swing Object aus JTable AWT, Swing, JavaFX & SWT 1
S 3D Object Viewer AWT, Swing, JavaFX & SWT 13
R Graphics-Object speichern AWT, Swing, JavaFX & SWT 4
J 2D-Grafik Graphics2D object in ein anderes Zeichnen AWT, Swing, JavaFX & SWT 7
M Object[][] in double[][] casten AWT, Swing, JavaFX & SWT 6
D Object mit JTable verknüpfen AWT, Swing, JavaFX & SWT 7
A Swing Drag and Drop TreeNode User Object AWT, Swing, JavaFX & SWT 3
D JTree - Zugriff auf Nodes mit Object AWT, Swing, JavaFX & SWT 6
N JComboBox mit Custom Object AWT, Swing, JavaFX & SWT 2
D JRadioButton Object AWT, Swing, JavaFX & SWT 2
L JTable SelectRowByValue(Object Value)? AWT, Swing, JavaFX & SWT 3
F Serialisiertes Object geht nicht zu Inizialisieren AWT, Swing, JavaFX & SWT 7
G Image Object speichern oder in ein BufferedImage umwandeln AWT, Swing, JavaFX & SWT 2
P Wie das Component Object des Hauptfensters ermitteln? AWT, Swing, JavaFX & SWT 4
J Nochmal Drag&Drop, ABER: Object verschieben AWT, Swing, JavaFX & SWT 2
S Object auf Knopfdruck dem Frame hinzufügen AWT, Swing, JavaFX & SWT 2
F polygon object "stirbt" vor Ausführung in paint() AWT, Swing, JavaFX & SWT 4
S Object in Color umwandeln AWT, Swing, JavaFX & SWT 2
M drag and drop a object in swt AWT, Swing, JavaFX & SWT 2
M JTree Elemete zeigen nach 2. Mausklick Object an. Warum? AWT, Swing, JavaFX & SWT 2
M Warum wird Graphics-Object zerstört? AWT, Swing, JavaFX & SWT 8
T object in tabelle AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben