Tanelorn.net
Medien & Phantastik => Multimedia => Multimedia - Software & Betriebsysteme => Thema gestartet von: Imion am 12.08.2007 | 23:49
-
Und wieder stehe ich vor einem Problem, das ich selbst mit den Sun-Tutorials und dem was ich sonst noch so im INet finde bisher nicht überwinden konnte.
Ich will eine indetermined Progress Bar einbauen, die ihr Werk verrichtet, sobald man einen Button betätigt.
Durch eben erwähnte Betätigung werden unter Anderem einige while-Schleifen in Gang gesetzt, die schon mal einige Zeit in Anspruch nehmen können.
Sobald die Berechnungen abgeschlossen sind, sollte auch die ProgressBar aufhören, ihren Weg von links nach rechts zu gehen.
Habe mir dass ungefähr wie folgt vorgestellt:
private void ButtonActionPerformed(java.awt.event.ActionEvent evt) {
ProgressBar.setIndetermined(true); /*ab hier sieht man die ProgressBar "laufen" */
Button.setEnabled(false);
/*
*
* Hier wird berechnet
*
*/
ProgressBar.setIndetermined(false); /*ab hier steht die ProgressBar wieder still */
Button.setEnabled(true);
}
Zwar wird in den Sun-Tutorials zum Thema der Umstand erwähnt, das man die Berechnungen im Hintergrund laufen lassen sollte, damit man auch merkt, dass die ProgressBar läuft, aber wie man das hinbekommen soll, habe ich leider nicht verstanden. Daher friert meine GUI ein, solange die Berechnungen durchgeführt werden, und nichts ist mit sichtbarem Progress.
Freue mich über jegliche Hilfe.
PS: Falls jemand weiss, wie man bei zu lange laufenden Berechnungen (also wenn die Geduld mal wieder nur in zu kleinen Mengen vorhanden ist) selbige per Button Abbrechen kann, würde ich mich auch in diesem Falle über einen Post freuen.
-
Lies dir mal How to Use Progress Bars (http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html#indeterminate) und
und den Beispielcode ProgessBarDemo.java (http://java.sun.com/docs/books/tutorial/uiswing/examples/components/ProgressBarDemoProject/src/components/ProgressBarDemo.java) dazu durch. Dort wird beispielhaft erläutert, wie du die von dir geforderte Aufgabe lösen kannst. Du brauchst dazu eine Progessbar und einen im Hintergrund laufenden Threads (SwingWorker), der die Berechnung durchführt. Mittels der ListenerInterfaces verbindest du die beiden Klassen und kannst so beide interagieren lassen.
Dieser im Hintergrund laufende Tread ist einfach eine (innere) Klasse (im Bsp. Task genannt), der in der Methode doRunInBackground() deine Berechnung durchführt. Gestartet wird der Task in actionPerformed(ActionEvent anEvent) mittels task.execute(). Genauso könntest du den Task in einem ActionListerners an einem anderen Buttons auch unterbrechen (task.cancel()). Du musst nur etwas aufpassen, dass bei einem Abbruch keine unvollständigen Berechnungen irgendwo gespeichert werden und so dein Datenzusatnd inkonsitent wird.
-
Lies dir mal How to Use Progress Bars (http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html#indeterminate) und
und den Beispielcode ProgessBarDemo.java (http://java.sun.com/docs/books/tutorial/uiswing/examples/components/ProgressBarDemoProject/src/components/ProgressBarDemo.java) dazu durch. (...)
Auf genau das Tutorial bin ich auch schon gestern gestossen, allerdings nicht schlau drauss geworden. Werde mir das Ganze in ruhiger Stunde nochmal zu Gemüte führen.
-
Mit dem Konstrukt
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
<Hier Methode aufrufen>
}
});
kannst du aus SWING heraus eine GUI-Änderung oder Aktion so anstossen, das die anstossende Routine nicht auf ihn wartet. Ist unter SWING sehr wichtig da sonst die GUI hängt.
SwingWorker worker = new SwingWorker() {
public Object construct() {
getMyDialog().getMyController().bearbeiteBefehle(aktOrder);
return "Done";
}
public void finished() {
}
};
worker.start();
ist die Alternative wenn du komplexere Rechenprozesse anstossen möchtest. Einfach mal nach SwingWorker auf java.sun.com suchen, da findest du die aktuelle Version (V3 oder so) des SwingWorkers.
Ach ja, als Bücher zu empfehlen sind von O'Reilley "JAVA Swing" sowie "Swing Hacks". Ersteres ist ein "Dumme Frager erschlagen" Werk, letzteres eine Sammlung von kurzen Tricks