invokeLater - Wann?

Status
Nicht offen für weitere Antworten.

taouri

Aktives Mitglied
Hallo zusammen,

könnte mir bitte mal jemand erklären, wann genau man invokeLater (oder auch invokeAndWait) wirklich einsetzen muss. Ich habs leider noch immer nicht begriffen, trotz vielem Java-Tutorial lesen. Auch die Java Insel konnte mir nicht weiterhelfen. Muss ich z.B. generell in einem Eventhandler invokeLater benutzen, oder jedesmal wenn ich die GUI anspreche? Welche Befehle kann man zusammen in einen Thread hauen? Wann brauche ich einen einzelnen?

Ich hoffe jemand kann mir helfen

Gruß

taouri
 

Wildcard

Top Contributor
Swing ist nicht threadsicher (mit ausnahme des repaint() aufrufs).
Wann immer ein Thread (der nicht der EventDispatcher Thread ist) also direkt oder indirekt(indirekt heißt zB du fügst Daten in ein Model ein, das daraufhin die GUI updatet) die GUI verändert, muss diese Veränderung mit dem EventDispatcherThread synchronisiert werden -> invokeLater
 

Leroy42

Top Contributor
Code:
public void actionPerformed(ActionEvent e) {
  // Hier kann direkt die GUI angesprochen werden,
  // da alles was hier steht im EDT ausgeführt wird.

  new Thread(new Runnable() {
    public void run() {
      // Hier [i]sollte[/i] die GUI mit invokeLater angesprochen werden
      // Allerdings gibt es auch viele Thread-sichere Operationen wie
      // textField.setText("..."), ...
    }}).start();
}
 

Leroy42

Top Contributor
Wildcard hat gesagt.:
Im Zweifelsfall immer den Weg über invokeLater gehen

Was sind denn die Zweifelsfälle?
Oder anders gefragt: Ist es aus der API ersichtlich ob eine Methode Swing-sicher ist.

Ich verfahre hierbei, entgegen meiner sonstigen Einstellung, ganz pragmatisch.

Solange ich nichts merkwürdiges bemerke, heb' ich mir
invokeLater-Aufrufe für schlechte Zeiten auf. :cool:
 

Wildcard

Top Contributor
Leroy42 hat gesagt.:
Was sind denn die Zweifelsfälle?
Liegt wohl im Sinne des Betrachters. Ich lese mir nicht die API jeder mir grundsätzlich bekannten Methode durch bevor ich sie benutze. Lieber etwas in invokeLater was auch so funktionieren würde als andersrum.
Der Fehlerfall ist bei Threads nunmal schwer reproduzierbar und hat die Eigenart prinzipiell nur beim Kunden oder Präsentationen aufzutreten :autsch:
 

taouri

Aktives Mitglied
Oje... Wenn man nur mal wüsste, wieviel man Threadsicher machen muss BEVOR man ne GUI programmiert. Das wird ne Menge Arbeit fürcht ich. Meine GUI hat nämlich die unangenehme Angwohnheit auf Knopfdruck abzustürzen. Jetzt kommt aber das interessante:

Ich habe zwei Wege programmiert:

1. Ein Methodenaufruf, der durch einen Befehl über die Konsole ausgeführt wird.
2. Ein Knopf, der einen ActionListener besitzt, der durch invokeLater geschützt, die Methode aufruft, also eigentlich Thread-sicher ist.

Der Witz ist, Weg eins funktioniert, während bei der anderen Der Knopf gedrückt bleibt und sich die GUI bis zum St. Nimmerleinstag verabschiedet. Ich wüsste nur gern, wie man dieses Phänomen erklären will... Jemand ne Idee?

Gruß

taouri
 

Wildcard

Top Contributor
Das synchronisieren ist nicht weiter tragisch, da man in aller Regel nur sehr wenige Worker Threads braucht, die oft auch nur eine Aktion ausführen bevor sie beendet werden.
Zu deinem Problem: da bräuchte ich schon Code.
 

taouri

Aktives Mitglied
Das Problem is, dass ich leider nicht genau sagen kann wos dran liegt, und da es wirklich ein größeres Programm ist, in dem sehr viel auf die GUI zugegriffen wird, müsste ich schon so an die 600 Zeilen Code hier rein schreiben. Ich glaube das sprengt den Rahmen. Ich werd jetzt mal (bzw. Morgen *gähn*) versuchen das ganze generell abzusichern.

Gruß

taouri
 

byte

Top Contributor
Aus diesem Grund ist es sinnvoll, nach dem MVC Prinzip zu trennen. Wenn Du genau einen (oder wenige) Punkte hast, an denen die GUI aktualisiert wirst, dann behälst Du auch leichter den Überblick über Deinen Entwurf.
 
G

Guest

Gast
Das Problem is nur, dass ich sone Art eigene Canvas geschreiben hab, die nunmal leider ziemlich oft auf sich selbst zugreift. Diese Zugriffe kann ich nicht minimieren. Von außen sind es gar nicht so viele Zugriffe.
 

taouri

Aktives Mitglied
Naja, über diverse Listener halt. Die müssen aber, um mit der GUI zu kommunizieren, Methoden dieser aufrufen.
 

becksdasflenst

Neues Mitglied
Leroy42 hat gesagt.:
Code:
public void actionPerformed(ActionEvent e) {
  // Hier kann direkt die GUI angesprochen werden,
  // da alles was hier steht im EDT ausgeführt wird.

  new Thread(new Runnable() {
    public void run() {
      // Hier [i]sollte[/i] die GUI mit invokeLater angesprochen werden
      // Allerdings gibt es auch viele Thread-sichere Operationen wie
      // textField.setText("..."), ...
    }}).start();
}

tach, gesell ich mich ma hier dazu...

wie sprech ich denn das GUI mit invokelater in der run an? invokeLater() will ja ne runnable als parameter. da kommt dann this rein oder wie?

Mein Problem:
hab ne JList mit einträgen die ausm vector kommen. jetzt add ich dem vector dynamisch per knopfdruck weitere einträge, die aber nicht sichtbar werden, allerdings ergeben konsolenausgaben das die einträge korrekt im vector gelandet sind...

Die Lösung: invokeLater (anscheinend... ;) aber ich bekomms nich gebacken... das was ich an einträgen ändere muss in die run methode oder wie?
 

taouri

Aktives Mitglied
Hi,

Ich kann dir zwar nicht sagen, wie's genau richtig gemacht wird, aber ich denke mit this hättest du einige Probleme. Wenn du nämlich in der run()-Methode den invokeLater auf das Runnable der gerade laufenden run() legst, dann müsste das, soweit ich das richtig sehe, dazu führen, dass du in einer Endlosschleife landest:

Code:
Runnable<-------------------|
   -> run()                 |
       -> invokeLater(this)-|

Also:

der Thread, der eigentlich das Runnable darstellt, wird mit start() gestartet. Damit läuft dessen run() - Methode an. die run()-Methode wiederum ruft per invokeLater ein Event in den EDT. Dieses wird abgearbeitet, was darin resultiert, dass die run()-Methode erneut anläuft und wieder invokeLater aufgerufen wird, usw.
Sollte es falsch sein. möge mich jemand korrigieren.

Für dein Problem fällt mir jetzt aber noch ein ähnliches von mir ein, das mit einem JTree funktionierte. Auf den habe ich dann einfach updateUI() gemacht und es hat funktioniert. Zwar sollte diese Methode etwas völlig anderes machen (nämlich das Look and Feel updaten) aber bei mir hat es dazu geführt, dass die Einträge sichtbar wurden.


Gruß

taouri
 

byte

Top Contributor
Code:
// irgendwo in einem anderen Thread

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    // GUI aktualisieren
  }
});
 

Marco13

Top Contributor
Zweifelfälle gibt es eigentlich keine. (Im Zweifelsfall ist der Zweifelsfall nicht ThreadSafe). Eigentlich steht es in der Api-Doku immer explizit dabei, wenn eine Methode Threadsafe ist
Bsp.
http://java.sun.com/javase/6/docs/api/javax/swing/text/JTextComponent.html#setText(java.lang.String)

Edit: Ach so, das war ein alter Thread, der wieder hochgepoppt ist. Hab ich übersehen. :roll:
 

Oni

Top Contributor
Ich muss das Thema noch mal aufgreifen, weil ich mir da bisschen unsicher bin.

Folgende Situation:

Ich habe ein DatenModel mit Getter- und Setter-Methoden. Mein GUI greift auf das Model zu um Daten anzuzeigen.
z.B. Button wird geklickt Daten gelesen und angezeigt.
Das Model befülle ich zum Teil (nicht immer) in einem separaten Thread, die Daten kommen aus einer Datenbank und es kann einen paar sekunden dauern bis die geladen sind. Muss ich dann das Model auch über invokeLater befüllen? oder reicht es wenn ich die Setter- und Getter synchronized mache?

Gruß Oni
 
G

Gast

Gast
Ich sicher nicht, aber ich hab noch ne Frage:

Ich hab mir über invokelater bisher nie viele gedanken gemacht, ich hab immer nur den Konstruktor meines GUI über invokelater aufgerufen...

Wenn ich das jetzt hier richtig verstehe muss ich jede Methode über invokelater aufrufen die etwas an meinem GUI ändert (Component hinzufügt, löscht, updated, sliderwerte verändert, etc, außer repaint()) ist das korrekt?
 
T

tim247

Gast
Gast hat gesagt.:
Wenn ich das jetzt hier richtig verstehe muss ich jede Methode über invokelater aufrufen die etwas an meinem GUI ändert (Component hinzufügt, löscht, updated, sliderwerte verändert, etc, außer repaint()) ist das korrekt?

aber nur aus einem separaten thread oder? wenn ich ohne zusätzliche threads arbeite, oder die das GUI nicht verändern braucht ich weder invokeLater noch invokeAndWait oder?
 
B

Beni

Gast
tim247 hat gesagt.:
Gast hat gesagt.:
Wenn ich das jetzt hier richtig verstehe muss ich jede Methode über invokelater aufrufen die etwas an meinem GUI ändert (Component hinzufügt, löscht, updated, sliderwerte verändert, etc, außer repaint()) ist das korrekt?

aber nur aus einem separaten thread oder? wenn ich ohne zusätzliche threads arbeite, oder die das GUI nicht verändern braucht ich weder invokeLater noch invokeAndWait oder?
Ja
 
O

otto

Gast
Muss man auch für Erzeugung eines JDialogs invokeLater verrwenden?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Swing Wann invokeLater() verwenden? AWT, Swing, JavaFX & SWT 7
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
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
F invokeLater() vs synchronized(Object) AWT, Swing, JavaFX & SWT 5
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
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
R wann liefert getEditingRow was brauchbares ? AWT, Swing, JavaFX & SWT 2
K Swing Wann benötigt man JFrames? AWT, Swing, JavaFX & SWT 5
M SWT /Jface Wann einen ColumnLabelProvider benutzen? AWT, Swing, JavaFX & SWT 2
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
B Swing JScrollPane - observen wann eine JScrollBar angezeigt wird? AWT, Swing, JavaFX & SWT 5
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
S Listener der mich informiert wann immer einer Liste ein Element hinzugefuegt wird? AWT, Swing, JavaFX & SWT 4
G Abfragen, wann JFrame dargestellt ist AWT, Swing, JavaFX & SWT 3
H Benachrichtigt werden wann ein Container repainted wird? AWT, Swing, JavaFX & SWT 5
I Wann genau startet der AWT-Thread? AWT, Swing, JavaFX & SWT 3
M AbstractAction, wann benutzen? AWT, Swing, JavaFX & SWT 2
T Fenster verschieben => Wann fertig? AWT, Swing, JavaFX & SWT 8
S Wann brauche ich die prepareRenderer() Methode ? AWT, Swing, JavaFX & SWT 2
M Wann AbstractTableModel und wann DefaultTableModel AWT, Swing, JavaFX & SWT 4
M wann wird paintComponent() aufgerufen AWT, Swing, JavaFX & SWT 4
E Problem mit JPanel - Wann wird size berechnet? AWT, Swing, JavaFX & SWT 5
A Swing: Wann ist eine Komponente gezeichnet? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben