Swing SwingWorker - Prozess stoppen

Nuiton

Bekanntes Mitglied
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.
 

Thallius

Top Contributor
Du must einfach in Deiner while Schleife abfragen ob der Thread gecanceled wurde (isCanceled()) und dann entsprechend die Schleife beenden.

Gruß

Claus
 

Nuiton

Bekanntes Mitglied
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.
 

Thallius

Top Contributor
Naja eigentlich musst du das isCanceled in jeder Schleife abfragen, denn es kann ja zu jeder Zeit abgebrochen werden.
 

Joose

Top Contributor
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 ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Prozess mit Runtime.getRuntime in SwingWorker aufrufen AWT, Swing, JavaFX & SWT 6
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing SwingWorker - max 10 Threats werden gestartet !? AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
S Swing SwingWorker - richtige Implementierung doInBackground() AWT, Swing, JavaFX & SWT 5
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
C Swing SwingWorker abbrechen AWT, Swing, JavaFX & SWT 12
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
Psypsy Swing SwingWorker unterschied zwischen setProgress und process AWT, Swing, JavaFX & SWT 2
A Swingworker rückgabewert verwenden AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
M Liste mittels SwingWorker füllen klappt nicht AWT, Swing, JavaFX & SWT 10
Iron Monkey SwingWorker verschwindet nicht AWT, Swing, JavaFX & SWT 10
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
G SwingWorker setProgress Problem AWT, Swing, JavaFX & SWT 17
K Frage zu ProgressBar, SwingWorker etc. AWT, Swing, JavaFX & SWT 4
G SwingWorker AWT, Swing, JavaFX & SWT 2
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
S SwingWorker :( AWT, Swing, JavaFX & SWT 6
F swingworker und eventdispatch thread AWT, Swing, JavaFX & SWT 9
S SwingWorker - ich werde wahnsinnig AWT, Swing, JavaFX & SWT 4
0 SwingWorker Tutorial ? AWT, Swing, JavaFX & SWT 2
L SwingWorker Thread pausieren AWT, Swing, JavaFX & SWT 12
L SwingWorker Statusabfrage AWT, Swing, JavaFX & SWT 8
M Kann ein SwingWorker nur einmal laufen? AWT, Swing, JavaFX & SWT 2
J SwingWorker, get und boolean AWT, Swing, JavaFX & SWT 6
H JavaFX Prozess bei dem Start pausieren AWT, Swing, JavaFX & SWT 5
N JavaFX TextArea Updaten bevor Prozess gestartet wird AWT, Swing, JavaFX & SWT 7
X Swing Ein neues Fenster öffen aber ohne ein extra Prozess zu starten AWT, Swing, JavaFX & SWT 1
G Nebenläufiger Prozess mit Dialog AWT, Swing, JavaFX & SWT 2
M Prozess-Icon im Prozessmanager AWT, Swing, JavaFX & SWT 8
G Frage zum paint Prozess AWT, Swing, JavaFX & SWT 3
C Wie kann ich den Sound stoppen? AWT, Swing, JavaFX & SWT 4
G Fenster erst nach Stoppen des Threads anzeigen AWT, Swing, JavaFX & SWT 3
G Swing Timer stoppen AWT, Swing, JavaFX & SWT 4
R Thread stoppen, nachdem eine Taste gedrückt wird AWT, Swing, JavaFX & SWT 2
O Thread zerstören / stoppen in java 1.5? AWT, Swing, JavaFX & SWT 9
M JTextPane - Zeilenumbruch verhindern stoppen deaktivieren :) AWT, Swing, JavaFX & SWT 5
m@nu JTable: Editor stoppen AWT, Swing, JavaFX & SWT 8
Z javax.swing.Timer: wie stoppen??? AWT, Swing, JavaFX & SWT 9
R TableCellEditor -> editieren stoppen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben