Hallo an Alle,
das Anzeigen einer JProgressBar in meinem Fenster raubt mir gerade den letzten nerv. Ich sitze da jetzt seit Tagen dran und komm nicht weiter. Hab schon unzählige Foren durchstöbert und alles ausprobiert.
Nun poste ich mal mein Problem, evtl. hab ich irgendetwas übersehen oder falsch verstanden.
Ich hab ein Fenster bei dem nach betätigen des Buttons einige (theoretisch bis 999, in der Praxis so um die 100) Einträge in einer Hashtable gespeichert werden sollen. Die Einträge werden dynamisch in einer for-Schleife erzeugt. (Fahrplan von einer Bahn - erste Fahrt wird angegeben und dann alle xx Minuten wiederholen). Während des speicherns soll eine ProgressBar angezeigt werden.
Das hinzufügen selber hab ich in einen SwingWorker gepackt. Ich hab den erweitert um die Variable int progress und die Methode int getProgress(), so soll der Prozentwert des Fortschritts aus dem SwingWorker ausgelesen werden.
Hier nun der Code:
In diesem Beispiel ist nun ein Timer benutzt worden. Ich hab es auch schon mit SwingUtilities.invokeLater() probiert. Funktioniert leider auch nicht. Anhand des System.out.println ist das Problem klar. Die ProgressBar wird immer erst hinterher aktualisiert. Bei invokeLater() hab ich sogar eine Out of Memory: Heap Space Exception, soviel invokeLaters() setzt er auf die Heap, arbeitet aber keines ab. auch nicht, wenn ich mit sleep() den SwingWorker schalfen lege, oder einen Monitor und wait() bzw. notifyAll() benutze.
Das einzige was geht ist, wenn ich im SwingWorker selber ProgressBar.paint() aufrufe. Aber dann flackert die ProgressBar unglaublich.
Kann ich eine paint-Methode erzwingen, die die ProgressBar nicht vorher mit dem weißen Hintergrund füllt? So könnte man das Flackern loswerden, dann wäre ich ja schon glücklich.
Also wenn einer eine Idee hat, bin ich über jeden Vorschlag sehr erfreut. Sonst mach ich schon mal mit flackernder Anzeige weiter.
Vielen Dank...
das Anzeigen einer JProgressBar in meinem Fenster raubt mir gerade den letzten nerv. Ich sitze da jetzt seit Tagen dran und komm nicht weiter. Hab schon unzählige Foren durchstöbert und alles ausprobiert.
Nun poste ich mal mein Problem, evtl. hab ich irgendetwas übersehen oder falsch verstanden.
Ich hab ein Fenster bei dem nach betätigen des Buttons einige (theoretisch bis 999, in der Praxis so um die 100) Einträge in einer Hashtable gespeichert werden sollen. Die Einträge werden dynamisch in einer for-Schleife erzeugt. (Fahrplan von einer Bahn - erste Fahrt wird angegeben und dann alle xx Minuten wiederholen). Während des speicherns soll eine ProgressBar angezeigt werden.
Das hinzufügen selber hab ich in einen SwingWorker gepackt. Ich hab den erweitert um die Variable int progress und die Methode int getProgress(), so soll der Prozentwert des Fortschritts aus dem SwingWorker ausgelesen werden.
Hier nun der Code:
Code:
private void WiederhAddBtnActionPerformed(java.awt.event.ActionEvent evt) {
ProgressBar.setVisible(true);
paintAll(this.getGraphics());
final SwingWorker Adder = new SwingWorker() {
private boolean runs = false;
public Object construct() {
runs = true;
int readInt = -1;
int h = -1;
int min = -1;
int takt = -1;
int anzahl = -1;
Linie linie = (Linie) WiederhLinienBox.getSelectedItem();
int tag = EinmaligTagCBox.getSelectedIndex();
readInt = getInt(WiederhStdField);
if (readInt >= 0)
h = readInt;
readInt = getInt(WiederhMinField);
if (readInt >= 0)
min = readInt;
readInt = getInt(WiederhTaktField);
if (readInt >= 0)
takt = readInt;
readInt = getInt(WiederhAnzahlField);
if (readInt >= 0)
anzahl = readInt;
if ((h >= 0) && (min >= 0) && (takt >= 1) && (anzahl >= 1) && (linie != null) && (tag >= 0)) {
for (int i = 0; i < anzahl; i++) {
int zeit = (h * 100) + min;
tempPlan.addStop(zeit, tag, linie, (Haltestelle) Haltestellen.getSelectedItem());
min = min + takt;
if (min > 59) {
h++;
if (h > 23)
h = h % 24;
min = min % 60;
}
progress = (( i * 100 ) / anzahl);
System.out.println("Zeit: " + zeit + " added.");
// ProgressBar.setValue(progress);
// ProgressBar.paint(ProgressBar.getGraphics());
}
}
runs = false;
return new Boolean(true);
}
public void finished() {
updatePlan();
ProgressBar.setVisible(false);
}
};
setInput(false);
refreshTimer = new Timer(50, new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
ProgressBar.setValue(Adder.getProgress());
System.out.println("refresh");
if (!Adder.isRunning()) {
refreshTimer.stop();
}
}
});
refreshTimer.start();
Adder.start();
boolean added = ((Boolean) Adder.get()).booleanValue();
setInput(true);
Adder.finished();
}
In diesem Beispiel ist nun ein Timer benutzt worden. Ich hab es auch schon mit SwingUtilities.invokeLater() probiert. Funktioniert leider auch nicht. Anhand des System.out.println ist das Problem klar. Die ProgressBar wird immer erst hinterher aktualisiert. Bei invokeLater() hab ich sogar eine Out of Memory: Heap Space Exception, soviel invokeLaters() setzt er auf die Heap, arbeitet aber keines ab. auch nicht, wenn ich mit sleep() den SwingWorker schalfen lege, oder einen Monitor und wait() bzw. notifyAll() benutze.
Das einzige was geht ist, wenn ich im SwingWorker selber ProgressBar.paint() aufrufe. Aber dann flackert die ProgressBar unglaublich.
Kann ich eine paint-Methode erzwingen, die die ProgressBar nicht vorher mit dem weißen Hintergrund füllt? So könnte man das Flackern loswerden, dann wäre ich ja schon glücklich.
Also wenn einer eine Idee hat, bin ich über jeden Vorschlag sehr erfreut. Sonst mach ich schon mal mit flackernder Anzeige weiter.
Vielen Dank...