JProgressBar löst propertyChange bei setProgress nicht aus

Ich habe viele verschiedene Artikel über JProgressBar gelesen.Hier.

Die meisten deuten darauf hin, dass Sie einen SwingWorker benötigen, um die Dinge richtig laufen zu lassen, was durchaus Sinn macht. Wenn ich setProgress (value) aufrufe, um die Fortschrittsanzeige zu aktualisieren, wird das propertyChange-Ereignis die meiste Zeit nicht ausgelöst. Ich habe den Wert, den ich an setProgess übergebe, überprüft und er ändert sich definitiv jedes Mal. Ich bin mir also nicht sicher, ob das Ereignis nur zu schnell ausgelöst wird? Bitte beachten Sie den entsprechenden Code unten. Jede Hilfe / Erklärung wird gebeten.

class ProgBar extends SwingWorker
{
    public ProgBar()
    {
        addPropertyChangeListener(new PropertyChangeListener()
        {
           @Override
           public void propertyChange(PropertyChangeEvent evt)
           {
               if ("progress".equals(evt.getPropertyName()))
               {
                   int value = (Integer)evt.getNewValue();
                   System.out.println("propertyChange called with: " + value);
                   loginProg.setValue(value);
               }
           }
        });

        loginProg.setStringPainted(true);
        loginProg.setValue(0);
        setProgress(0);
    }

    @Override
    public Void doInBackground() throws InterruptedException
    {
        ...
        int count = 0;
        for (Folder f : folders)
        {
            ... // process 'f'
            setProgress((int)Math.min(((double)count/folders.length)*100.0, 100.0));
        }
        ...
        return null;
    }

    @Override
    public void done()
    {
        System.out.println("Done called.");
        setProgress(100);
        loginProg.setValue(100);
    }
}

JProgressBar rief damit auf;

private void jButtonActionPerformed(java.awt.event.ActionEvent evt) 
{                                             
        // Create new thread to run progess bar.
        // Otherwise won't be able to update progress bar.
        ProgBar pb = new ProgBar();
        pb.execute();
    }
}    

BEARBEITEN:
Ja, also hätte ich die Javadocs besser lesen sollen;

Da PropertyChangeListener im Event Dispatch Thread asynchron benachrichtigt werden, können mehrere Aufrufe der setProgress-Methode auftreten, bevor PropertyChangeListener aufgerufen werden. Zu Leistungszwecken werden alle diese Aufrufe mit dem letzten Aufrufargument zu einem Aufruf zusammengefasst.

Zum Beispiel die folgenden Aufrufe:
setProgress (1);
setProgress (2);
setProgress (3);

Dies kann zu einer einzelnen PropertyChangeListener-Benachrichtigung mit dem Wert 3 führen.

I.E. Meine Annahme, dass setProgress zu schnell ausgelöst wurde, war richtig. Ein ProgressMonitor könnte eine bessere Lösung sein.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage