aktualisierung des View im MVC-Pattern

Ralph-Uwe

Bekanntes Mitglied
Hallo,

ich habe das MVC-Pattern, so wie hier im Forum beschrieben ist, für mein Programm benutzt.

http://www.java-forum.org/allgemeines/91829-mvc.html

Leider habe ich ein Problem mit der aktualisieren des Viewer.
In meinem Programm wird eine Datenübertragung über sie Serielleschnittstelle durchgeführt.
Diese Datenübertragung brauch eine gewisse Zeit, bis sie fertig ist.
Ich habe das Verhalten durch ein Thread.Sleep(3000) simuliert.
Java:
    public void changeDirection() {
        Direction[] dir = Direction.values();
        wind.setDir(dir[(int) (Math.random() * 4)]);
        try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }

Das Ergebnis ist, dass durch klicken auf den Button "Change Direction"
sich der Programmablauf um 3 sec. verzögert.

Aber bevor die Pause entsteht, wird im Model "Wind" die neue Windrichtung eingetragen und
der Observer (Windviewer) über das update benachrichtigt.
Im Windviewer wird die Methode
Java:
   public void update(Observable arg0, Object arg1) {
        Wind wind = (Wind) arg1;
        direction.setText(wind.getDir().toString());
        speed.setText(String.valueOf(wind.getSpeed()));
        System.out.println("update");
    }

aufgerufen.
Auf der Console wird auch sofort die Nachricht "update" ausgegeben.
Aber die Anzeige in der GUI wird erst aktallisiert, nachdem die Pause von 3sec. beendet wurde.

Meine Frage ist jetzt, wie bekomme ich die GUI dazu ihre Anzeige sofort nach dem update zu aktualisieren?

Ich habe schon versucht in die Methode
Java:
public void update(Observable arg0, Object arg1)
ein notify() einzufügen. Das funktioniert zwar, aber dann bekomme ich eine Exception:
java.lang.IllegalMonitorStateException
 

Marco13

Top Contributor
Das "changeDirection" wird wohl durch einen Buttonklick oder so ausgeführt. Dann bewirkt das Thread.sleep, dass dort der Event-Dispatch-Thread (EDT) schläft - also der, der für Benutzereingaben, neuzeichnen und alles andere, was mit dem GUI zu tun hat, verantwortlich ist.

Pauschal würde man sagen: Da muss man einen neuen Thread einfügen. Wenn man Änderungen am Modell durch beliebige Threads erlauben will, muss man aber aufpassen, dass die Änderungen in der View (bei einem update) dann wieder vom EDT gemacht werden (denn NUR der darf solche Änderungen machen). Das würde man dann mit SwingUtilities.invokeLater machen.

Poste mal eine "changeDirection"-Methode, die etwas näher an dem ist, was tatsächlich verwendet wird. (Die spannende Frage ist aber auch: Was soll während der Pause passieren? Sophisticated wäre natürlich ein modaler Dialog...)
 

Ralph-Uwe

Bekanntes Mitglied
erstmal danke für Deine schnelle Antwort.

"Thread.sleep" steht in diesem Beispiel für eine Serielledatenübertragung mit einem
Drucker. Das heiß, dass der Thread im Originalprogramm nicht schläft sondern arbeitet.

Es werden Steuerzeichen an den Drucker übertragen, der diesen auffordert Zählerstände
zu übermitteln. Leider dauert das etwas ;(
Aus diesem Grund möchte in der GUI die Info ausgeben, dass gerade Daten übertragen werden
Ausgabe : "auf Statusabfrage warten...", damit der Benutzer weiß was los ist.

Leider erfolgt die Anzeige jetzt erst, wenn die Übertragung beendet ist.
(dann brauche ich sie eigendlich nicht mehr)

Die Idee mit einem weiteren Thread ist nicht schlecht.
Leider ist mir noch nicht ganz klar wie ich den einbauen müsste.

Interessant ist auf jeden Fall die Tatsache, dass die Anzeige sofort aktualisiert wird, wenn
in der update Methode ein notify() aufgerufen wird.
Vielleicht hast Du eine Idee, wie die dann entstehende Exception weg bekommt.

Gibt es eine Möglichkeit den Event-Dispatch-Thread (EDT) dazu zu bekommen die GUI
zu aktualisieren?

Edit: SwingUtilities.invokeLater(gui) steht im der Mainmethode
Java:
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
 
            @Override
            public void run() {
                new WindController();
            }
        };
        SwingUtilities.invokeLater(gui);
    }
 
Zuletzt bearbeitet:
G

Gast2

Gast
Gibt es eine Möglichkeit den Event-Dispatch-Thread (EDT) dazu zu bekommen die GUI
zu aktualisieren?
Ja, deine Berechnung musst du wie gesagt in nem eigenen Thread ausführen.
Im einfachsten Fall reicht dir sowas wie:
Java:
new Thread(new Runnable() {
  public void run() {
    changeDirection();
  }
}).start();
 

Ralph-Uwe

Bekanntes Mitglied
ich danke Euch beiden für die gute Hilfe. :applaus: :toll:

Ich habe jetzt den gesamten zeitaufwendigen Teil ein einem eigenen Thread laufen.
Zwar mußte ich noch ein paar Anpassungen vornehmen, damit verhindert wird, dass
der Thread mehfach läuft, aber das war kein Problem.

Auf jeden Fall ist jetzt alles zu meiner Zufriedenheit. :cool:
 

Marco13

Top Contributor
"Thread.sleep" steht in diesem Beispiel für eine Serielledatenübertragung mit einem
Drucker. Das heiß, dass der Thread im Originalprogramm nicht schläft sondern arbeitet.

Dazu noch kurz: Wir haben beide Unrecht :D Der Thread schläft nicht. Er arbeitet aber vermutlich auch nicht. Sondern er wartet vermutlich auf die Daten (je nachdem, wie dieses Lesen von der Schnittstelle genau abläuft -deswegen die Aufforderung, genaueren Code zu posten). Aber "Schlafen" und "Auf Eingaben warten" hat hier denselben Effekt, nämlich dass er sich nicht mehr ums GUI kümmern kann (deswegen ist ein Thread.sleep zum Testen auch OK).

Eigentlich müßten die setText-Aufrufe in der update-Methode jetzt wieder auf dem EDT gemacht werden.

Kannst dir auch mal die Klasse SwingWorker (Java Platform SE 6) ansehen, die ist für Dinge gemacht, die vom GUI aus gestartet werden und "im Hintergrund" laufen sollen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Aktualisierung eines Buttons Java Basics - Anfänger-Themen 18
R Text Pane Aktualisierung erst nach JOptionPane Java Basics - Anfänger-Themen 10
C Array Aktualisierung wird nicht im Tooltip angezeigt Java Basics - Anfänger-Themen 2
M Gui Aktualisierung Java Basics - Anfänger-Themen 2
Private Void Auto-Aktualisierung der Zeitanzeige Java Basics - Anfänger-Themen 10
H Aktualisierung des JProgressBar in Abhängigkeit eines Threads Java Basics - Anfänger-Themen 5
T Canvas aktualisierung mit repaint Java Basics - Anfänger-Themen 5
G Fortlaufende Aktualisierung bei eigener Klasse Java Basics - Anfänger-Themen 2
G Aktualisierung von JTable Java Basics - Anfänger-Themen 4
I Problem mit Inhalt-Aktualisierung Java Basics - Anfänger-Themen 18
M Problem mit Aktualisierung von GridBagLayout Java Basics - Anfänger-Themen 2
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
G Model View Controller Java Basics - Anfänger-Themen 7
G SQL View query Java Basics - Anfänger-Themen 4
H Best Practice View probleme Java Basics - Anfänger-Themen 2
L Java Package View Java Basics - Anfänger-Themen 6
S Model View Controller: Verständnisproblem Java Basics - Anfänger-Themen 13
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
M Erste Schritte Eclipse + design view Java Basics - Anfänger-Themen 3
I Klassen Java Qt Model/View Datenhaltung Java Basics - Anfänger-Themen 4
G Eclipse: In Problems View schreiben? Java Basics - Anfänger-Themen 10
A Datentypen Typecast im View Java Basics - Anfänger-Themen 4
A OOP MVC Frage View Java Basics - Anfänger-Themen 2
F View überwachen Java Basics - Anfänger-Themen 6
C OOP Model View Controller - Prinzip Java Basics - Anfänger-Themen 6
S JTree, Problem mit View Update Java Basics - Anfänger-Themen 2
K JAVA HEX View! Java Basics - Anfänger-Themen 2
K Model-View-Controller Java Basics - Anfänger-Themen 15
K Frage zum Model View Controller Prinzip Java Basics - Anfänger-Themen 6
M Controller + View: Fehlermeldungen Java Basics - Anfänger-Themen 2
G Einbindung von MVC (Model-View-Controll) Java Basics - Anfänger-Themen 8
megachucky Model View Controller Pattern - Suche Hilfe bei Anwendung Java Basics - Anfänger-Themen 4
E MVC - Was darf View Java Basics - Anfänger-Themen 15
E MVC - ein View für mehrere Models Java Basics - Anfänger-Themen 2
S Model-View-Controller Konzept Beispiel Java Basics - Anfänger-Themen 11
D was ist der vorteil vom Builder-design pattern? Java Basics - Anfänger-Themen 11
W GoF-Pattern im Programmierer-Alltag Java Basics - Anfänger-Themen 113
D Java Pattern mit X Ausgabe Stern Java Basics - Anfänger-Themen 4
J Methoden Observer-Pattern mit Consumer und accept( ) Java Basics - Anfänger-Themen 6
Dimax Erste Schritte Pattern.matcher,die Besonderheiten. Java Basics - Anfänger-Themen 12
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
F Design pattern Java Basics - Anfänger-Themen 29
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
M Schlüsselworte Unterschied: String.matches und Pattern.compile Java Basics - Anfänger-Themen 2
C Best Practice JTable in MVC Pattern Java Basics - Anfänger-Themen 7
D Design Pattern Command Java Basics - Anfänger-Themen 3
Bregedur Methoden Matcher und Pattern bei sich wiederholenden Werten Java Basics - Anfänger-Themen 1
fLooojava MVC Pattern und Observer Pattern Java Basics - Anfänger-Themen 6
S Regex Pattern Java Basics - Anfänger-Themen 3
Z Pattern und Matcher substring zu String möglich? Java Basics - Anfänger-Themen 4
B Pattern für Email Liste Java Basics - Anfänger-Themen 3
J Builder Pattern implementieren Java Basics - Anfänger-Themen 3
Tarrew Proxy Design-Pattern Java Basics - Anfänger-Themen 1
M Methoden Pattern Matching Vokal Java Basics - Anfänger-Themen 2
agent47 Pattern split Java Basics - Anfänger-Themen 2
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
B Strategy Pattern - Rechner Java Basics - Anfänger-Themen 6
I Vertändnisfrage zu Prototype Pattern Java Basics - Anfänger-Themen 0
L Kompositum-Pattern Hilfe :O Java Basics - Anfänger-Themen 4
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
S Je nach erhaltene Daten unterschiedlich reagieren (Design Pattern?) Java Basics - Anfänger-Themen 3
B Pattern Matching ohne Match-Methoden Java Basics - Anfänger-Themen 11
Furtano OOP Memento Pattern | übergabe einer Kopie des Arrays Java Basics - Anfänger-Themen 0
F Erste Schritte Pattern zum Zerlegen von selbstdefinierten Dateinamen Java Basics - Anfänger-Themen 7
M MVC + Strategy Pattern Ansatz (mit Code) Java Basics - Anfänger-Themen 5
A Design Pattern - Welche? Java Basics - Anfänger-Themen 33
Rudolf OOP Übungen zu Design Pattern in Java Java Basics - Anfänger-Themen 6
A Observer Pattern Problem Java Basics - Anfänger-Themen 15
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
S OOP Regex Pattern Java Basics - Anfänger-Themen 2
P Grundsatzfrage zu Decorator-Pattern Java Basics - Anfänger-Themen 6
L Pattern Matching Java Basics - Anfänger-Themen 3
L RegExp bzw Pattern in Java Java Basics - Anfänger-Themen 6
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
M RegEx Pattern Matcher Java Basics - Anfänger-Themen 16
R Pattern bzw. Regex HTML-Code Java Basics - Anfänger-Themen 10
N Regexp Pattern & Matcher Problem Java Basics - Anfänger-Themen 4
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
R Welches Design pattern Java Basics - Anfänger-Themen 10
B static und Pattern matching Java Basics - Anfänger-Themen 22
T pattern klappt nicht so Java Basics - Anfänger-Themen 6
T Decorator Pattern Java Basics - Anfänger-Themen 7
A Pattern und Matcher Java Basics - Anfänger-Themen 9
T Frage zu Pattern/Matcher Java Basics - Anfänger-Themen 6
D Pattern in Midi-Sequencer Java Basics - Anfänger-Themen 2
V Frage zu Decorator-Pattern Java Basics - Anfänger-Themen 4
S OOP Factory Pattern Java Basics - Anfänger-Themen 2
C OOP Observer Pattern Java Basics - Anfänger-Themen 2
M Regex-Pattern Java Basics - Anfänger-Themen 2
Haubitze_Broese Pattern für Links in RSS-Reader Java Basics - Anfänger-Themen 6
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
megachucky regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen Java Basics - Anfänger-Themen 11
O useDelimiter / Muster im Parameter (Pattern) Java Basics - Anfänger-Themen 6
S Problem mit Pattern Java Basics - Anfänger-Themen 2
S Pattern.matches mit Ignore Case Java Basics - Anfänger-Themen 2
N in int array einen pattern(eine zahl) finden Java Basics - Anfänger-Themen 21
A Hilfe zu Pattern Java Basics - Anfänger-Themen 2
Y Pattern Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben