Scheinbar blockiert Swing bei JTree, was mach ich falsch?

  • Themenstarter Themenstarter jago
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

jago

Gast
Hi,

In einer Schleife iterier ich ueber alle leafs eines JTree und rufe folgende Methode auf:

tree.setSelectionPath(leafpath);

Wenn ich gleich nach dem ersten Aufruf stoppe, selektiert es tatsaechlich das Leaf und zeigt es an. Wenn ich das aber in einer Schleife mache, iteriert er erst ueber alle leafs bevor er die Anzeige des JTree refreshed. Kann ich auch nach jedem selektierten Leaf irgendwie ein refreshen erzwingen? jtree.repaint() oder jtree.validate scheinen nicht zu funktionieren.

Danke,
jago
 
Wahrscheinlich läuft die schleife im gleichen Thread wie die Oberfläche. Der Tree macht also gar nichts, bis die Schleife nicht beendet ist.
 
Wildcard hat gesagt.:
Wahrscheinlich läuft die schleife im gleichen Thread wie die Oberfläche. Der Tree macht also gar nichts, bis die Schleife nicht beendet ist.

Ja, beides der EDT (also der Swing thread).

Naja...aber die Schleife macht doch nix ausser tree.setSelectionPath(leafpath); aufzurufen.

Sollte nicht setSelectionPath(...) implizit den Leaf selektieren und dann auch JTree repainten, bevor die Schleife einen weiteren Schritt fortsetzen kann? Oder wie laeuft das ab?
 
Nein, Zeichnen passiert niemals synchron. Alles in Oberflächen läuft über den EventDispatcher der alle Events und Requests verteilt.
 
Wildcard hat gesagt.:
Nein, Zeichnen passiert niemals synchron. Alles in Oberflächen läuft über den EventDispatcher der alle Events und Requests verteilt.

Ich habe jetzt einen neuen thread erstellt und rufe indem folgendes auf:



Code:
								EventQueue.invokeAndWait(new Runnable() {
									public void run() {
										tree.setSelectionPath(parent);
									}
								});

mit invokeAndWait klappt es.Wuerde aber gerne nicht invokeAndWait nutzen...ich dachte davon wird abgeraten?


Koennt ihr mir mal kurz beschreiben wir ihr das machen wuerdet? Ich will einfach nur ein Refresh des JTree nach jedem tree.setSelectionPath(parent); haben. Vielleicht koennt ihr ein bissl Code schreiben, damit ich nicht wieder 3h rumteste ohne Erfolg.

Danke...
 
Wer rät von invokeAndWait ab?
Natürlich nimmt man besser invokeLater für asynchrone Operationen, aber für Synchrone gibt es keine Alternative.
 
Wildcard hat gesagt.:
Wer rät von invokeAndWait ab?
Natürlich nimmt man besser invokeLater für asynchrone Operationen, aber für Synchrone gibt es keine Alternative.

jup. InvokeAndWait wird abgeraten:

"Using the invokeAndWait Method

The invokeAndWait method is just like invokeLater, except that invokeAndWait doesn't return until the event-dispatching thread has executed the specified code. Whenever possible, you should use invokeLater instead of invokeAndWait — it is very easy to cause a deadlock using invokeAndWait. If you use invokeAndWait, make sure that the thread that calls invokeAndWait does not hold any locks that other threads might need while the call is occurring."


Das hab ich schon an vielen vertrauenswuerdigen Stellen gelesen und hatte auch mal ein Deadlock vor ein paar Jahren.



Kann ich nicht alles im Swing/EDT thread ausfuehren. Also:

tree.setSelectionPath(parent);
und dann noch den Methodenaufruf, der JTree in seiner neuen (aufgeklappten) From darstellt.


Btw, du sagtest:

"Nein, Zeichnen passiert niemals synchron. Alles in Oberflächen läuft über den EventDispatcher der alle Events und Requests verteilt."

Kannst du das ein bissl naeher erlaeutern? Ich dachte das Zeichnen laeuft auch im EDT, nein? Und wird nicht gleich nach einem tree.setSelectionPath(parent) auch implizit die Paint methoden ausgefuehrt im Normalfall?


Danke...
 
The invokeAndWait method is just like invokeLater, except that invokeAndWait doesn't return until the event-dispatching thread has executed the specified code. Whenever possible
Wenn du etwas synchron abgearbeitet werden muss, ist invokeLater eben nicht 'possible'
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben