Swing SwingWorker - Prozess stoppen

Guten Morgen.

Um es kurz zu fassen: Ich weiss nicht, inwiefern man ein SwingWorker Thread "canceln" kann, ohne dass dabei der Prozess selbst nicht mehr weiter geht.

Derzeit kann ich zwar den Thread "stoppen", jedoch wird mir nur der Text aus der done()-Methode angezeigt, und die file paths, die ich mithilfe von Apache FileUtils anzeigen lasse, werden trotzdem angezeigt.

Brauch ich einen zweiten Thread, um den Thread selber zu stoppen? Ich konnte nicht wirklich etwas finden, dass mich bis jetzt weiter gebracht hat. Muss ich checken, ob der Thread "interrupted" wird? Das kam auch z.B. immer wieder vor, als ich nach einer Loesung gesucht habe.

Meine SwingWorker-Klasse:
Java:
package main;
import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;

public class FileHandler extends SwingWorker<Vector, Vector> 
{
    private String dir;
    private DefaultTableModel model = (DefaultTableModel) table1.getModel();
   
    public FileHandler(String dir)
    {
        this.dir = dir;
    }

    @Override
    protected Vector doInBackground() throws Exception 
    {          
        Vector row = new Vector();

        while (true)
        {
            setProgress(0);
            SimpleDateFormat sdf = new SimpleDateFormat("M/dd/yy HH:mm:ss");
            File directory = new File(dir);
            System.out.println("Getting all files in " + directory.getCanonicalPath() + " including those in subdirectories");
            List<File> files = (List<File>) FileUtils.listFiles(directory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
            // Get max number of files
            int numFiles = files.size();
            // Modify progress bar
            progressBar.setVisible(true);
            progressBar.setMaximum(numFiles);
            progressBar.setStringPainted(true);
            progressBar.setString("Fetching..");
            int fileCount = 0;
            // Add progress to progressbar, wait 10 milliseconds.. do again
            while (fileCount <= numFiles)
            {
                progressBar.setIndeterminate(true);
                fileCount++;
            }

            for (File file : files) 
            {

                System.out.println("file: " + file.getCanonicalPath());
                // Get file info, file size, file date
                // Auskommentiert

                // Get file input stream
                // Add rows
                Vector v = new Vector();
                v.add(false);
                v.add(fileName);
                v.add(fileSize);
                v.add(fileDate);
                v.add(someOtherItem);

                publish(v);
            }

             return row;
        }
    }
   
    @Override
    protected void process(List<Vector> rowsList)
    {
            for(Vector a : rowsList)
            {
                DefaultTableModel tModel = (DefaultTableModel)table1.getModel();
                tModel.addRow(a);
            }
    }
   
   
    @Override
    protected void done()
    {
        System.out.println("DONE!");
        try {
            // Wait 1 second to set progressbar to invisible
            Thread.sleep(1000);
            progressBar.setVisible(false);
        } catch (InterruptedException ex) {
           ex.printStackTrace();
        }
    }
   
}
Die Klasse, in dem sich der Stop-Button befindet:
Java:
stopButton.addActionListener(new ActionListener()
{
   @Override
    public void actionPerformed(ActionEvent e) 
    {
          a.cancel(true);
     }               
});
Derzeit sieht bei mir der Output so aus (der Input, ist ein Pfad):
Code:
Getting all files in D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013) including those in subdirectories
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\01 Give Life Back to Music.m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\02 The Game of Love.m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\03 Giorgio by Moroder (www.LoMasRankiaO.com).m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\04 Within.m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\05 Instant Crush (feat. Julian Casablancas).m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\06 Lose Yourself to Dance (feat. Pharrell Williams).m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\07 Touch (feat. Paul Williams).m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\08 Get Lucky (feat. Pharrell Williams).m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\09 Beyond.m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\10 Motherboard.m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\11 Fragments of Time (feat. Todd Edwards).m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\12 Doin' It Right (feat. Panda Bear).m4a
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\13 Contact.m4a
DONE!
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\AlbumArtSmall.jpg
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\AlbumArt_{DA3B7FE9-7348-48C6-8EF4-4AB48C07A8ED}_Large.jpg
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\AlbumArt_{DA3B7FE9-7348-48C6-8EF4-4AB48C07A8ED}_Small.jpg
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\Cover.jpg
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\desktop.ini
file: D:\Music Import (C Drive)\Electronic\Daft Punk - Random Access Memories (2013)\Folder.jpg
Die done()-Methode wird also ausgefuehrt, der Thread geht aber weiter, bzw. wird nicht gestoppt.
 
Du must einfach in Deiner while Schleife abfragen ob der Thread gecanceled wurde (isCanceled()) und dann entsprechend die Schleife beenden.

Gruß

Claus
 
Vielen Dank fuer den Denkanstoss. Ich hab's zu erst versucht in der while-Schleife abzufragen, jedoch hat das auch nicht so richtig funktioniert. Das funktioniert jetzt alles einwandfrei, wenn ich die isCancelled()-Methode in meiner for-Schleife abfrage - so wird auch nicht jeder Dateiname ausgegeben, sondern auch nur diejenigen, die der SwingWorker "processed" hat.
 
Naja eigentlich musst du das isCanceled in jeder Schleife abfragen, denn es kann ja zu jeder Zeit abgebrochen werden.
 
Welchen Sinn soll die äußere while-Schleife haben? Diese wird aufgrund des "return" sowieso nur 1x ausgeführt.
Abgesehen davon sollte man ein while(true) vermeiden und eine richtige Abbruchbedingung verwenden ;)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben