Swing JProgressBar aktualisieren

vR34kSH0w

Mitglied
Hi,
ich habe einen Server geschrieben (der mittlerweile ganz gut funktioniert :toll::applaus:). Jetzt möchte ich aber, dass eine ProgressBar beim Starten angezeigt und natürlich auch aktualisiert wird.
Das geschieht aber nicht. Es wird lediglich ganz zum Schluss einmal aktualisiert.
Hierzu ein paar Ausschnitte:

MODEL
[JAVA=241]
public boolean startServer(String serverName, int port, JTextArea textArea, PropertyChangeListener listener)
{
startServer = new StartServerTask(serverName, port, textArea);
startServer.addPropertyChangeListener(listener);
startServer.execute();

if(startServer.isCancelled()) return false;
else return true;
}
[/code]
[JAVA=416]
public class StartServerTask extends SwingWorker <Void, Void>
{
int port;

String serverName;
JTextArea textArea;

public StartServerTask(String serverName, int port, JTextArea textArea)
{
this.serverName = serverName;
this.port = port;
this.textArea = textArea;
}

protected Void doInBackground() throws Exception
{
setProgress(0);

server = new ChatServer(serverName, port, textArea);

setProgress(50);

server.start();

setProgress(100);

return null;
}
}
[/code]

CONTROLLER
[JAVA=265]
public void propertyChange(PropertyChangeEvent pce)
{
if(pce.getPropertyName() == "progress")
{
System.out.println(pce.getNewValue());

if((Integer) pce.getNewValue() == 100) view.setProgressBarValue(0);
else view.setProgressBarValue((Integer) pce.getNewValue());
}
}
[/code]

Was in der View passiert, dürfte ja nicht für das Problem verantwortlich sein!?
Warum reagiert der Listener nur beim letzten Event??? ???:L
EventDispatchThread!?

Noch ganz nebenbei: Gibts eine genauere Möglichkeit den Progress in der Worker-Klasse zu setzen, also einen Wert, der tatsächlich beschreibt, wie weit der Prozess ist und nicht, was ich mal so grob geschätzt hab?

Danke schonmal
Gruß
vR34k$H0w
 

Michael...

Top Contributor
Scheint auf den ersten Blick zu passen. Eventuell dauert nur das Erstellen eines ChatServer Objekts etwas und start() dauert nicht lange genug, dass man überhaupt etwas mitbekommt. (Einfach mal ein System.out.println(...); an den verschiedenen Punkten ausgeben lassen.
Noch ganz nebenbei: Gibts eine genauere Möglichkeit den Progress in der Worker-Klasse zu setzen, also einen Wert, der tatsächlich beschreibt, wie weit der Prozess ist und nicht, was ich mal so grob geschätzt hab?
Genauer geht nur, wenn man die Dauer genauer abschätzen kann oder sich der Prozess in kleinere Teilschritte unterteilen lässt.
In Deinem Fall ist es vermutlich besser einfach einen Ladebalken oder ein Ladesymbol (wie z.B. im Browser beim Laden von Seiten) zu verwenden.
 

hdi

Top Contributor
Bau mal ein paar Thread.sleep(1000) in die doInBackground. Also jeweils nach dem setProgress(). Dann solltest du ja ganz klar sehen ob die ProgressBar während des Prozesses aktualisiert wird oder nicht. Wenn ja, ist alles korrekt. Wenn der Job nun mal so schnell abgearbeitet wird, dann ist das halt so. Wenn sich dahingegen auch mit künstlicher Verzögerung nichts an der ProgressBar tut während des Prozesses, dann stimmt etwas nicht. Kann eigentlich wirklich nur an der ProgressBar selber liegen, siehe das was GUI Programmer sagte.
 

vR34kSH0w

Mitglied
dankeschön =) alles stimmt ich hab vergessen minimum und maximum zu setzen und mit einem sleep wird auch der fortschritt angezeigt ^^ allerdings wundert mich das ganze trotzdem, weil der prozess an sich eigentlich schon recht lange dauert da müsste man normalerweise was sehen...
 

vR34kSH0w

Mitglied
zu früh gefreut

folgendes funktioniert jetzt:
[JAVA=426]
public class StartServerTask extends SwingWorker <Void, Void>
{
int port;

String serverName;
JTextArea textArea;

public StartServerTask(String serverName, int port, JTextArea textArea)
{
this.serverName = serverName;
this.port = port;
this.textArea = textArea;
}

protected Void doInBackground() throws Exception
{
setProgress(0);

server = new ChatServer(serverName, port, textArea);

setProgress(50);

Thread.sleep(100);

server.start();

setProgress(100);

return null;
}
}
[/code]

und das hier nicht:
[JAVA=361]
public class ConnectServerTask extends SwingWorker <Void, Void>
{
boolean isAccepted = false;

int port;

String ip;

public ConnectServerTask(String ip, int port)
{
this.ip = ip;
this.port = port;
}

protected Void doInBackground() throws Exception
{
setProgress(0);

client = new ChatClient(ip, port);

setProgress(10);

Thread.sleep(100);

writeMessage(profileName);

setProgress(20);

Thread.sleep(100);

client.waitForAccept();

setProgress(40);

Thread.sleep(100);

if(client.isAccepted())
{
isAccepted = true;

writeMessage(String.valueOf(profileColor.getRed()));

setProgress(60);

Thread.sleep(100);

writeMessage(String.valueOf(profileColor.getGreen()));

setProgress(80);

Thread.sleep(100);

writeMessage(String.valueOf(profileColor.getBlue()));

setProgress(100);
}
else
{

}

return null;
}
}
[/code]

sieht jemand einen unterschied!?!?

nebenbei: was findet ihr besser? eine progressbar einsetzen und einen geschwindigkeitsverlust von etwa 500 ms in kauf nehmen, damit der benutzer so in etwa weiß, wo er grade dran is oder auf die progressbar verzichten und den benutzer 2-3 s im ungewissen lassen?? (im endeffekt läufts wahrscheinlich darauf hinaus das sowieso nur ich der benutzer bin, aber prinzipiell :D)
 

GUI-Programmer

Top Contributor
Ich persönlich würde bei deinem Fall, da es sich ja eh nur um wenige Werteänderungen der JProgressbar handelt, diese mit
Code:
 setIndeterminate(true)
dauerhaft in Bewegung setzen.
 

vR34kSH0w

Mitglied
prinzipiell würd ich das umsetzen =) guter tipp aber ich kriegs nicht auf die reihe ???:L die anweisungen während welchen die progressbar laufen soll stehn ja im swingworker also sollten die doch im hintergrund ablaufen und das gui nicht behindern. allerdings passiert genau das.

ActionEvent->ProgressBar "zum Laufen bringen" (setIndeterminate(true))->Model die Worker-Klasse ausführen lassen->ProgressBar anhalten

Dennoch: Während der SwingWorker beschäftigt ist, mach das gui NICHTS ;(
 

vR34kSH0w

Mitglied
okay danke das funktioniert sehr gut jetzt hab ich nur noch ein problem mit der semantik...
das gui soll ja reagieren wenn der task fertig ist (mit der methode done()). diese steht im model welches soweit ich weiß nicht auf die view zugreifen sollte. ich kann aber schlecht den controller warten lassen bis der task fertig ist dann wär das gui ja wieder blockiert...muss ich da einen propertychangelistener für einsetzen?? wenn ja wie überprüft man dort welcher task gerade bei 100% angekommen ist? die progressbar ist schließlich die gleich ... *langsam verzweifel* ^^
 
D

Dennis4

Gast
Kommt darauf an welche Art MVC Architektur du verwendest, ich verwende Gerne das erweiterte MVC Model welches den Controller als Mediator zwischen Model und View vorsieht.
Dabei sollte das Model nicht auf die View zugreifen. Das Model sollte die View nicht einmal kennen. Genausowenig kennt die GUI das Model, für die Kommunikation zwischen Model und GUI wird der Controller eingesetzt. Der Controller sollte eine Art PropertyChangeListener/Observer implementieren und sich beim Model registrieren. Das Model erzeugt dann die Events, wenn sich ein Property verändert hat. der Controller sammelt die Events auf und leitet weiter an alle in ihm registrierten Views. Die Views entscheiden dann, wie sie die neuen Werte darstellen.

Hat den Vorteil, dass in einer Server Client Architektur nur der Controller nach außen hin offen sichtbar ist.

Für weitere Information: ACCU :: Model View Controller with Java Swing
 

vR34kSH0w

Mitglied
okay wusste nicht dass das erweitertes mvc heißt aber genau das möchte ich verwenden =)
also müsste ich das mit einem propertychangelistener machen. ist ja kein problem, aber ich habe nur eine progressbar und mehrere worker die sich bei beendigung unterschiedlich auf die view auswirken sollen...angenommen das changeevent ist jetzt progress und die value 100...wie kann man denn dann abfragen welche worker-klasse gerade 100 erreicht hat?
 
D

Dennis4

Gast
Das ist eigentlich ganz einfach. Es gibt die ja keiner vor was in deinem PropertyChangeEvent drin steht.
Mithilfe des PropertyChangeSupport von java kannst du eine firePropertyChange Methode aufrufen, der du drei Argumente gibst. Das erste ist der PropertyName, zweite das oldValue und dritte das newValue, wobei old und newValue jeweils Object sein müssen. das heißt du kannst dir eine eigene Klasse schreiben, die wie du es benötigst einen quell thread besitzt sowie ein progressValue.

Aufpassen musst du nur, der PropertyChangeSupport von Java überprüft ob sich old und newValue unterscheiden und wenn nicht dann wird nicht gefeuert. Also musst du gegebenenfalls die equals Methode überschreiben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
A Swing JProgressbar im Windows Look & Feel Farbanpassung AWT, Swing, JavaFX & SWT 2
G JProgressBar: Verständnis Problem AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
T Swing JProgressBar mit String unschön AWT, Swing, JavaFX & SWT 5
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
D Swing JProgressBar soll ende erkennen AWT, Swing, JavaFX & SWT 4
M JProgressBar updatet nicht AWT, Swing, JavaFX & SWT 4
T Swing JProgressBar Indeterminate bleibt stehen bei neuem Fenster AWT, Swing, JavaFX & SWT 6
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
J JProgressBar Indeterminate AWT, Swing, JavaFX & SWT 17
J JProgressBar Farbverlauf AWT, Swing, JavaFX & SWT 2
O Probleme mit JProgressBar bei der Statusanzeige AWT, Swing, JavaFX & SWT 5
S jProgressbar von einem Download AWT, Swing, JavaFX & SWT 6
C Swing JProgressBar in JDialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
S Swing StatusLeiste mit JProgressBar AWT, Swing, JavaFX & SWT 4
S JProgressBar in Abhängigkeit eines FileInputStreams AWT, Swing, JavaFX & SWT 2
S (Applets) JProgressBar wird erst am Ende angezeigt AWT, Swing, JavaFX & SWT 13
S Problem mit JProgressBar AWT, Swing, JavaFX & SWT 3
E Swing DB Zugriff mit JProgressBar?! AWT, Swing, JavaFX & SWT 8
C Swing JProgressBar Aktualisiert sich nicht. AWT, Swing, JavaFX & SWT 9
M JProgressBar Look and Feel AWT, Swing, JavaFX & SWT 5
C JProgressBar und JLabel AWT, Swing, JavaFX & SWT 5
K JProgressBar transparent AWT, Swing, JavaFX & SWT 10
M JProgressBar AWT, Swing, JavaFX & SWT 2
K JProgressBar für Serialisierung AWT, Swing, JavaFX & SWT 6
multiholle [JProgressBar] Raster deaktivieren AWT, Swing, JavaFX & SWT 14
M JProgressBar übereinander legen? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Repaint bei JProgressBar AWT, Swing, JavaFX & SWT 3
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
H JProgressBar in TableColumn von JTable setzen/abfragen AWT, Swing, JavaFX & SWT 5
B JProgressBar: wie muss ich das lösen? AWT, Swing, JavaFX & SWT 4
R JProgressBar-Verhalten AWT, Swing, JavaFX & SWT 5
G JProgressbar AWT, Swing, JavaFX & SWT 8
A JProgressBar: Farbe im Windows Look&Feel ändern. AWT, Swing, JavaFX & SWT 1
C JProgressBar und ihre Tücken AWT, Swing, JavaFX & SWT 8
G JProgressBar in JTable AWT, Swing, JavaFX & SWT 6
G Probleme mit JProgressbar auf JPanel in JFrame AWT, Swing, JavaFX & SWT 6
F JProgressBar und NullPointerException AWT, Swing, JavaFX & SWT 4
T JProgressBar und CMP Bean AWT, Swing, JavaFX & SWT 2
J JProgressBar flackert AWT, Swing, JavaFX & SWT 14
S JProgressBar zu JOptionPane hinzufügen. AWT, Swing, JavaFX & SWT 8
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
L JProgressbar möglichst genau AWT, Swing, JavaFX & SWT 3
G JProgressBar + Thread + Client AWT, Swing, JavaFX & SWT 10
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JProgressBar String anzeigen, danach wieder normale Ansicht AWT, Swing, JavaFX & SWT 3
G JProgressBar AWT, Swing, JavaFX & SWT 8
L JProgressBar wird nicht mehr aktualisiert AWT, Swing, JavaFX & SWT 2
U JProgressBar in umgekehrter Richtung AWT, Swing, JavaFX & SWT 2
S JProgressBar einbinden AWT, Swing, JavaFX & SWT 5
H JProgressBar AWT, Swing, JavaFX & SWT 6
T JProgressBar und JPG AWT, Swing, JavaFX & SWT 2
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
G JavaFX BarChart während der Runtime aktualisieren AWT, Swing, JavaFX & SWT 4
T TableView aktualisieren AWT, Swing, JavaFX & SWT 1
W JavaFX TableView aktualisieren AWT, Swing, JavaFX & SWT 1
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
J Swing JLabel Verknüpfung aktualisieren AWT, Swing, JavaFX & SWT 3
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
M Muss man die ObservableList aktualisieren? AWT, Swing, JavaFX & SWT 3
B Bounds aller Panels aktualisieren AWT, Swing, JavaFX & SWT 0
-DD Lobby/Spielerliste aktualisieren bei Suche AWT, Swing, JavaFX & SWT 1
T JFrame aktualisieren AWT, Swing, JavaFX & SWT 2
M JavaFX Automatisches Aktualisieren der Seite AWT, Swing, JavaFX & SWT 26
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
H JavaFX - Label aktualisieren AWT, Swing, JavaFX & SWT 1
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
J JTextfield automatisch aus zweiter Klasse aktualisieren AWT, Swing, JavaFX & SWT 5
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
lumpigerAffe Swing Jframe aktualisieren AWT, Swing, JavaFX & SWT 27
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
C JavaFX TreeTableView aktualisieren AWT, Swing, JavaFX & SWT 10
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
H Combobox aktualisieren AWT, Swing, JavaFX & SWT 2
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
L GUI - Jpanel - Splitpane will nicht aktualisieren AWT, Swing, JavaFX & SWT 4
2 Zeit Differenz automatisch aktualisieren AWT, Swing, JavaFX & SWT 1
N JavaFX Stage aktualisieren AWT, Swing, JavaFX & SWT 5
A JComboBox mit Array aktualisieren AWT, Swing, JavaFX & SWT 7
S Swing JComboBox mit Listener aktualisieren AWT, Swing, JavaFX & SWT 13
O Statusleiste mit JLabel aktualisieren AWT, Swing, JavaFX & SWT 5
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
AssELAss Verzeichnis JFileChooser aktualisieren AWT, Swing, JavaFX & SWT 0
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
T Int-Wert aktualisieren? AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben