java-update progressbar
Ich habe ein JFrame und die folgenden Komponenten.
JButton = jButton1
Progress Bar = progressBar und seine public static
JLabel = status und seine public static
Wenn die Taste klickt, dann verschiedene Anweisungen ausführen. Ich will update my progressbar nach jeder Anweisung. Hier ist mein code
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Task pbu = new Task(25, "Step 1....");
pbu.execute();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
pbu = new Task(50, "Step 2....");
pbu.execute();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
pbu = new Task(75, "Step 3....");
pbu.execute();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
pbu = new Task(100, "Done");
pbu.execute();
}
Hier ist meine Aufgabe-Klasse erweitert mit SwingWorker
public class Task extends SwingWorker{
private int progress;
private String stat;
public Task(int pr, String st) {
progress = pr;
stat = st;
}
@Override
protected Object doInBackground() throws Exception {
NewJFrame1.progressBar.setValue(progress);
NewJFrame1.status.setValue(stat);
return null;
}
}
Irgendeine Idee, wie kann ich dieses problem lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie nicht wollen, zu aktualisieren, GUI-Komponenten aus dem Swing-thread.
SwingWorker
bietet Haken für Zeug wieder auf den Event Dispatch Thread, das ist, was es konzipiert wurde. Rufen Sie diepublish
Methode vondoInBackground
und überschreibenprocess
zum detail mit inkrementellen updates. Oder, wenn Sie nur zum aktualisieren der GUI, wenn es fertig ist, überschreiben diedone()
Methode.Ein sehr einfaches Beispiel:
Bearbeiten
@mKorbel ist ein guter Punkt, dass für die oben genannten arbeiten, die es braucht, um zu verlängern
SwingWorker<Void, Integer>
...Void
wird die Gesamtrendite Wert geben Sie (in diesem Fall angibt, es gibt keinen Rückgabewert) undInteger
wobei der Typ des inkrementellen updates.Wenn der Arbeiter produziert eine tatsächliche Endergebnis (wird abgerufen mit
get()
) dann ist dieser Typ kann verwendet werden, anstelle vonVoid
. Ich hatte diese details, da ich nicht die Klasse Erklärung.Sehen
SwingWorker
lohnt sich der Aufwand. Gibt es ähnliche Beispiele here und in der API selbst.Zusätzlich zu der Antwort von Mark, die Sie wirklich nicht wollen, zu schlafen in der
actionPerformed()
Methode. Diese Methode ist (wenn verbunden mit einer GUI-Komponente) genannt, die von der AWT/Swing event dispatch thread, der gleiche thread, der auch nicht malen und alles. Solange deine Methode ist noch nicht fertig, deine GUI blockiert werden.Alles tun, Ihre Wartezeit in einem SwingWorker oder anderen thread.