Hallo zusammen,
ich habe einen Methode als SwingWorker implementiert, da ansonsten das Hauptprogramm warten würde. Um den Benutzer ein Feedback zu geben möchte ich den ProgressMonitor verwenden. Soweit ist auch alles klar. Nur wird bei mir der registrierte PropertyChangeListener nicht aufgerufen, wenn ich den Progress mit setProgress neu setze.
Hier ist nun mein Quellcode:
Ich habe extra schon mit % 50 nur jede 50 Wertänderung mit setProgress gesetzt, trotzdem wird der PropertyChangeListener nicht aufgerufen. Hier die dazugehörige Console Ausgabe:
Eigentlich sollte er danach die done() Methode aufrufen. Also irgendwie scheint da etwas nicht so zu funktionieren, wie ich das gerne möchte
Danke
ich habe einen Methode als SwingWorker implementiert, da ansonsten das Hauptprogramm warten würde. Um den Benutzer ein Feedback zu geben möchte ich den ProgressMonitor verwenden. Soweit ist auch alles klar. Nur wird bei mir der registrierte PropertyChangeListener nicht aufgerufen, wenn ich den Progress mit setProgress neu setze.
setProgress
protected final void setProgress(int progress)
Sets the progress bound property. The value should be from 0 to 100.
Because PropertyChangeListeners are notified asynchronously on the Event Dispatch Thread multiple invocations to the setProgress method might occur before any PropertyChangeListeners are invoked. For performance purposes all these invocations are coalesced into one invocation with the last invocation argument only.
For example, the following invokations:
setProgress(1);
setProgress(2);
setProgress(3);
might result in a single PropertyChangeListener notification with the value 3.
Hier ist nun mein Quellcode:
Java:
public class TestSwingWorker extends SwingWorker<Void, Void> {
private Cube cube;
private List<Element> allElements;
public TestSwingWorker(List<Element> elements) {
allElements = elements;
}
@Override
protected Void doInBackground() throws Exception {
System.out.println("ENTER doInBackground()");
setProgress(0);
final int totalElementCount = allElements.size();
int currentElementCount = 0;
for (Element currentElement : allElements) {
// do something
if (++currentElementCount % 50 == 0 || currentElementCount >= totalElementCount) {
int currentProgress = (int) ((double)currentElementCount / (double)totalElementCount * 100);
System.out.println("setProgress " + currentProgress);
setProgress(currentProgress);
}
}
System.out.println("return null");
return null;
}
@Override
protected void done() {
System.out.println("ENTER done()");
// do something
}
}
TestSwingWorker swingWorker = new TestSwingWorker(allElements);
swingWorker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
System.out.println("ENTER propertyChange()");
}
});
swingWorker.execute();
Ich habe extra schon mit % 50 nur jede 50 Wertänderung mit setProgress gesetzt, trotzdem wird der PropertyChangeListener nicht aufgerufen. Hier die dazugehörige Console Ausgabe:
ENTER doInBackground()
ENTER propertyChange()
setProgress 6
setProgress 12
...
setProgress 96
setProgress 100
retturn null
Eigentlich sollte er danach die done() Methode aufrufen. Also irgendwie scheint da etwas nicht so zu funktionieren, wie ich das gerne möchte
Danke