swingworker.cancel(true) bricht den Swingworker nicht ab

Andyx1975

Mitglied
Hallo,

ich habe ein Problem mit meinen Swingworkern und meiner Java GUI. Ich habe eine GUI geschrieben zum Suchen und Durchsuchen von Dateien. Damit die GUI richtig funktioniert und es zu keinen Freezes kommt, verwende ich Swingworker. Hier ein Beispiel:

Java:
buttonSearchFile.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							System.out.println("buttonSearchFile.actionPerformed, event="+evt); //$NON-NLS-1$
	
							// shows pop up if no source path is selected
							if (txtSourceFolder.getText().equals("")) //$NON-NLS-1$
							{
								keepWindow = true;
								
								JOptionPane.showConfirmDialog(null, 
										CLanguage.getString("GFileFinder.66")  //$NON-NLS-1$
										+ labelSourceFolder.getText() + CLanguage.getString("GFileFinder.67"), CLanguage.getString("GFileFinder.68"),   //$NON-NLS-1$ //$NON-NLS-2$
										JOptionPane.CLOSED_OPTION, JOptionPane.ERROR_MESSAGE);
								
								keepWindow = false;
							}
								
							else
							{
								// Sets the button status of all buttons in the button panel
								setButtonStatusProzessing();
								
								
								// calls the search method
								SwingUtilities.invokeLater(workerSearchFile = new SwingWorker<Boolean, Void>()
								{
									@Override
									protected Boolean doInBackground()
									{
										keepWindow = true;
										searchFiles(); // Calls method for searching files
										keepWindow = false;
										return true;
									}
									
									@Override
									protected void done() 
									{
										cancelSwingworker();
										keepWindow = false;
									}
								});
								
								
								
								// Executes the SwingWorker; the GUI will not freeze
								
								workerSearchFile.execute();
							}
						}
					});


Jetzt habe ich einen Button integriert der den Prozess abbrechen soll, also den Swingworker beenden. Hier rufe ich den Befehl "workerSearchFile.cancel(true);" auf, dieser Zeigt aber keinerlei Wirkung. Die Suche läuft knadenlos weiter. Hat Jemand eine Idee was hier schief läuft?

Danke
Andy
 
Der Swingworker ist doch mit dem ausführen der Suchen beschäftigt, daher ist mein verdacht das er gar nicht das event mit dem cancel verarbeiten kann. deine Suchroutine müsste pausieren und fragen ob sie abgebrochen werden soll. Wenn ja denn ende.
 
@wakoz hat recht, dein Programm ist noch mit suchen beschäftigt und kann daher das Event nicht abfragen.

Ich würde dir empfehlen, du erzeugst einen eigenen Thread, der in kurzen regelmäßigen Abständen (z.B. nach jeder durchsuchten Datei) eine Variable überprüft, die bestimmt, ob er abbrechen soll. Das funktioniert bei solchen anwendungen meist zuverlässiger.
 
ok vielen dank erstmal für die Denkanstöße...ich habe noch nie viel mit Threads gearbeitet....werde es mir mal jetzt genauer anschauen und die Lösung posten. Danke******
 
Zurück