Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Java Swing Gui Update (http://www.informatikerboard.de/board/thread.php?threadid=2299)


Geschrieben von InformaTiger am 23.05.2015 um 23:10:

  Java Swing Gui Update

Hallo,

ich bin derzeit bei einem Projekt beschäftigt bei welchem ich anhand eines Events (mit einem Listener) eine Swing Gui updaten muss. Ich habe es bereits mit revalidate(), repaint(), SwingUtilities.invokeLater und sogar einem eigenen Thread versucht. Jedoch bewegt sich die Progressbar und die Label erst wenn der Prozess durchgelaufen ist unglücklich Die letzte Version meines Codes sieht so aus:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
@Override
public void backupChanged(){
         SwingUtilities.invokeLater(() -> {
               jPBProgress.setMaximum(backupManager.getCount());
               jPBProgress.setValue(backupManager.getCurrent());
               jLCount.setText(backupManager.getCurrent() + " of " + backupManager.getCount());
               jLCurrent.setText(backupManager.getCurrentFile().getName());
               getRootPane().revalidate();
         });     
}



Geschrieben von eulerscheZahl am 24.05.2015 um 06:16:

 

Du brauchst verschiedene Threads, wenn die Benutzeröberfläche während der Arbeit reagieren soll.
Schau mal hier vorbei: oracle.com



Geschrieben von InformaTiger am 24.05.2015 um 11:34:

 

Ich habe mir das von Oracle mal angesehen. Muss ich zwingend den PropertyListener bzw. den SwingWorker verwenden, damit ich das entsprechende Update machen kann? Ich habe eben das hier implementiert. Also eigenen Listener usw. - aufgerufen wird es laut Debugging auch.

Gruß,
InformaTiger



Geschrieben von eulerscheZahl am 24.05.2015 um 11:50:

 

Das die Funktion aufgerufen wird, heißt nicht, dass die Oberfläche auch neu gezeichnet wird. Und selbst wenn dir das gelingt, wird die Oberfläche bei nur einem Thread zwischen den Änderungen an der Progressbar nicht reagieren.

Du kannst es mit Events machen, aber die eigentliche Berechnung darf nicht im selben Thread erfolgen, wie das UI. Dazu kannst du von Thread erben oder Runnable implementieren und diese Klasse dann von der UI Klasse aufrufen.

Im Anhang ist ein Programm, das mit Runnable und Observer arbeitet, war eine Übungsaufgabe im letzten Semester.



Geschrieben von InformaTiger am 26.05.2015 um 20:21:

 

Ohh man, bin ich doof. Zunge raus Ich habe die klarerweise die falsche Aktivität im eigenen Thread gestartet: also das UI Update war im eigenen Thread und die Berechnung fand im UI Thread statt. War jetzt auch nicht mehr wirklich schwer - musste nur einen Thread um die Berechnung packen. Danke, ist klar jetzt.

Mfg
InformaTiger


Forensoftware: Burning Board, entwickelt von WoltLab GmbH