Swingworker rückgabewert verwenden

athikka

Aktives Mitglied
Hallo zusammen

ich lade in einem Swingworker einige dateien auf einen FTP-server hoch und will dabei die fortschritt anzeigen (deshalb swingworker - mit anderen wie invokelater geht es nicht)

nun möchte ich aber eine liste der hochgeladenen dateien zurückgeliefert bekommen:

Java:
public String[] fileUpload(final File[] f, final boolean compress, final String ftpPath){
       

final String[] ee; //für return der fileupload methode

        SwingWorker<String[], Void> worker = new SwingWorker<String[], Void>() {
    
                
                public String[] doInBackground() {
    
                   
                    
                    LinkedList<String> paths = new LinkedList<String>(); //soll zurückgegeben werden in der methode wenn fertig
                
                    //...FTP verbindung erstellen und verbinden...
                    
                    for(final File ff : files){ //alle selektierten dateien hochladen
                        if(ff.isDirectory()) {
                            try {
                               ftp.makeDirectory(ff.getName());
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            
                            paths.add("DIR:" + directory + "/" + ff.getName());
                            
                            storeFiles(ff, ftp, ff.getName() + "/");
                           } 
                        } 
                    

    
                  //  ...FTPLogout...;

    
                    return paths.toArray(new String[0]);
                    
                }
    
    
    
                protected void done() {
                   
                    try {
                        ee = get(); [B][COLOR="Red"]//hier meckert es[/COLOR][/B] egal was ich versuche
//get() kann ich ja hier wegen dem void nicht returnen...
                    } catch (InterruptedException e) {

                    } catch (ExecutionException e) {

                    }
                    
                }
            };
            
            worker.execute();

        return ee;

ich bekomme auch kein ergebnis wenn ich statt dem "return ee" sage: "return worker.get()"...


ich krieg das string array einfach nicht aus dem swingworker heraus... kann mir wer helfen?

egal wie, ich will einfach das String[] aus dem worker herausbekommen wenn er fertig ist damit ich damit weiterarbeiten kann...
 
T

Tomate_Salat

Gast
Das weiterarbeiten wird eher schwierig, da du oft nicht weist, WANN der worker fertig ist. Wenn du weiterarbeiten willst, dann entweder in einer neuen Methode oder direkt in der done()-methode. Der SwingWorker wäre wohl auch sinnlos, wenn du nach [c]worker.execute();[/c] darauf wartest, dass er fertig wird ;-).

MFG

Tomate_Salat
 

eRaaaa

Top Contributor
Das weiterarbeiten wird eher schwierig, da du oft nicht weist, WANN der worker fertig ist. Wenn du weiterarbeiten willst, dann entweder in einer neuen Methode oder direkt in der done()-methode. Der SwingWorker wäre wohl auch sinnlos, wenn du nach [c]worker.execute();[/c] darauf wartest, dass er fertig wird ;-).

MFG

Tomate_Salat

Mhm? Verstehe ich nicht, meine Antwort wäre gewesen:
"Du musst doch get() nicht unbedingt in done() aufrufen. Kannst ja auch außerhalb, es wird dann einfach der Thread blockiert, bis doInBackground fertig ist." :autsch:
 
T

Tomate_Salat

Gast
Das man get(); außerhalb aufrufen kann, habe ich noch garnicht gesehen. Ich habe das so noch nicht verwendet, aber spontan würde ich sagen, du erreichst damit genau dass Gegenteil von dem was du willst: du machst aus asynchron synchron. Da kannst du dir auch gleich den Worker sparen.

Edit Hier nochmal zur verdeutlichung:
Java:
public class WorkerDemo
{
    public static void main(String[] args)
    {
        SwingWorker<String[], Void> worker    = new SwingWorker<String[], Void>()
        {
            @Override
            protected String[] doInBackground() throws Exception
            {
                try {
                    Thread.sleep(2000);
                } catch(InterruptedException e) {
                    e.printStackTrace();
                }
                                
                return new String[] {"a","b","c"};
            }
        };
        
        long current    = System.currentTimeMillis();
        worker.execute();
        
        try {
            worker.get();
        } catch(InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e)  {
            e.printStackTrace();
        }

        System.out.println("Dauer: " + ((System.currentTimeMillis() - current)/1000) + "s" );
    }
}

Ergebnis:
Code:
Dauer: 2s
 
Zuletzt bearbeitet von einem Moderator:

athikka

Aktives Mitglied
also werd ich um eine eigene version des swingworkers nicht rumkommen?

blöd dass ich hier codeverdoppeln muss nur weil ich einen rückgabewert haben möchte (in done weiterarbeiten)...
 

eRaaaa

Top Contributor
Also jetzt kann ich dir überhaupt nicht mehr folgen...
----
Mhm. Nö, ich habe eine lange Aktion die ich abarbeite(das passiert in einem (Worker)Thread != EDT (doInBackground()), zwischendurch möchte ich den Fortschritt anzeigen (process() -> EDT).Ganz am Ende könnte ich das Gesamtergebnis wieder in meiner GUI anzeigen(das hätte man dann in der done machen können(auch EDT)) oder eben in meinem anderen aktuellen Thread(!= EDT) weiter bearbeiten...
Natürlich hast du recht, wenn man keine Zwischenergebnisse in der GUI veröffentlichen will(ich habe ihn aber so verstanden dass er das machen will (wobei, dann wäre das Void falsch ;/), würde das so nicht wirklich Sinn machen.
Schau dir das zweite Beispiel in SwingWorker (Java Platform SE 6) an, das ist ähnlich!
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
also werd ich um eine eigene version des swingworkers nicht rumkommen?

Nein, erklär erstmal wie du das weiter behandeln willst. Vllt geht es ja auch so mit dem [c]get()[/c] (ob das immernoch hilft, dass die GUI nicht blockiert kann ich dir so ohne selbst zu testen nicht sagen). Wenn dein Thread also warten kann, dann mache es so. Wenn es blockiert, kannst du es immernoch so machen, aber arbeitest aus der [c]done();[/c]-Methode heraus, so wie ich es oben angesprochen hatte.

Edit
@eRaaaa: Setzt vorraus, dass man die Anwendung korregt im EDT startet. Und wie ich in diesem Post zusätzlich angemerkt habe: ich weis nicht, ob das blockieren der GUI verhindert wird. Habe bisher versucht immer zu vermeiden, auf den SwingWorker zurückgreifen zu müssen.
 
Zuletzt bearbeitet von einem Moderator:

athikka

Aktives Mitglied
neinnein, entshculdige falls ich undeutlich war

ich habe eine schöne uploadfunktion gebaut (eben dieser swingworker oben)
den habe ich fürs forum nur ordentlich gekürzt, also da stecken noch viele feinheiten drinnen (FTP verbindungen usw)

ich hätte jtzt gehofft dass ich diese fileUpload einfach mit nem rückgabewert versehen kann der mir sagt wo die dateien am server jetzt genau liegen (weil ein zufallsordner erstellt wird beim hochladen).

damit ich diese hochgeladenen dateien gleich als links weiterverwenden kann im programm

(eine art rapidshare vom system: ich selektiere dateien, diese werden hochgeladen und ich krieg nen link zurück wo genau sie liegen)

ich hoffe ihr könnt mir folgen
 
T

Tomate_Salat

Gast
Ja ich war wohl zu sehr auf das Asynchrone fixiert. Versuche es mal über das [c]get()[/c] wie es eRaaaa hier erwähnt hat:

Java:
import java.awt.Dimension;
import java.util.List;
import java.util.concurrent.ExecutionException;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;


public class WorkerDemo
{
    public static void main(String[] args)
    {
        final JFrame frame    = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        final JProgressBar bar    = new JProgressBar();
        bar.setMaximum(10);
        bar.setValue(0);
        bar.setPreferredSize(new Dimension(200, 20));
        
        frame.add(bar);
        
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
        
        SwingWorker<String[], Void> worker    = new SwingWorker<String[], Void>()
        {
            
            @Override
            protected String[] doInBackground() throws Exception
            {
                for(int i=1; i<=10;i++) {
                    try {
                        publish();
                        Thread.sleep(1000);
                    } catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                
                return new String[] {"c:\\asdf.jpg","d:\\jkl.png","c:\\neuer ornder\\doat.java"};
            }
            
            @Override
            protected void process(List<Void> chunks)
            {
                bar.setValue(bar.getValue()+1);
            }
        };
        
        worker.execute();
        
        try {
            String[] data = worker.get();
            for(String d : data)
                System.out.println("UPLOADED FILE: " + d);
        } catch(InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }        
    }
}
 

eRaaaa

Top Contributor
ich hätte jtzt gehofft dass ich diese fileUpload einfach mit nem rückgabewert versehen kann der mir sagt wo die dateien am server jetzt genau liegen (weil ein zufallsordner erstellt wird beim hochladen).

damit ich diese hochgeladenen dateien gleich als links weiterverwenden kann im programm


Ja, dann brauchst du ja auch nicht die done-Methode überschreiben?! ;/ rufe nach execute, einfach
Code:
return get();
auf anstelle von
Code:
return ee;
und gut ists.
Code:
fileUpload
darf dann natürlich nicht vom EDT ausgeführt werden, sondern von einem anderen Thread !
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
Nuiton Swing SwingWorker - Prozess stoppen AWT, Swing, JavaFX & SWT 4
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
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
X Prozess mit Runtime.getRuntime in SwingWorker aufrufen AWT, Swing, JavaFX & SWT 6
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
kodela Falscher Rückgabewert AWT, Swing, JavaFX & SWT 12
B Swing Windowbuilder Rückgabewert im Event AWT, Swing, JavaFX & SWT 3
J Action Listener Rückgabewert AWT, Swing, JavaFX & SWT 14
S Swing Eigenen JDialog mit Rückgabewert AWT, Swing, JavaFX & SWT 3
J Swing JDialog mit static-Funktion anzeigen -> Rückgabewert AWT, Swing, JavaFX & SWT 3
C Warten auf Rückgabewert im EventDispatchingThread AWT, Swing, JavaFX & SWT 8
L Rückgabewert aus Klasse mit JDialog AWT, Swing, JavaFX & SWT 6
GilbertGrape Wie komm ich an Rückgabewert des SwingWorkers? AWT, Swing, JavaFX & SWT 6
R Rückgabewert TreeSelectionListener für JInternalFrame AWT, Swing, JavaFX & SWT 4
A showConfirmDialog (Rückgabewert abfragen?) AWT, Swing, JavaFX & SWT 3
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
_user_q Objekte vom MainController in anderen Controller verwenden und andersherum (NullPointerException) AWT, Swing, JavaFX & SWT 14
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
O Soll ich einen JEditorPane verwenden ? AWT, Swing, JavaFX & SWT 5
S JavaFX Variablen in einem FXML File verwenden AWT, Swing, JavaFX & SWT 8
M JavaFX MenuBar und Camera zusammen verwenden AWT, Swing, JavaFX & SWT 2
F Welchen Layoutmanager verwenden? AWT, Swing, JavaFX & SWT 2
X Swing OOP Vorlage verwenden und bearbeiten AWT, Swing, JavaFX & SWT 3
V JavaFX, Pane construktor von einer Klasse in der Main verwenden. AWT, Swing, JavaFX & SWT 4
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
M AWT Java-Taschenrechner, wie Stack richtig verwenden? AWT, Swing, JavaFX & SWT 14
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
T NullLayout verwenden, oder nicht? AWT, Swing, JavaFX & SWT 9
O Welche GUI verwenden? AWT, Swing, JavaFX & SWT 2
S JCalendar verwenden AWT, Swing, JavaFX & SWT 5
G GUI Elemente aus NetBeans verwenden AWT, Swing, JavaFX & SWT 8
H Swing JPanel Inhalt wird bei verwenden von JPopup gelöscht AWT, Swing, JavaFX & SWT 5
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
I LookAndFeel Wie kann ich das Look and Feel "Blue Vista" verwenden? AWT, Swing, JavaFX & SWT 4
W Daten auf Textfeld in anderer Klasse verwenden AWT, Swing, JavaFX & SWT 4
R JOptionPane.YES_NO_CANCEL_OPTION im SaveDialog verwenden AWT, Swing, JavaFX & SWT 6
Y Swing JTabel verwenden ? AWT, Swing, JavaFX & SWT 11
Y JColorChooser verwenden AWT, Swing, JavaFX & SWT 8
D Objekt mit Button erstellen und mit anderem Button verwenden AWT, Swing, JavaFX & SWT 4
Luk10 NPE bei Verwenden von ActionListener! AWT, Swing, JavaFX & SWT 2
B Eingabe von JTextField verwenden AWT, Swing, JavaFX & SWT 10
A AWT Bilder als Link verwenden? AWT, Swing, JavaFX & SWT 11
S Koordinaten aus Array verwenden zum zeichnen auf JPanel?! AWT, Swing, JavaFX & SWT 3
F jFileChooser verwenden AWT, Swing, JavaFX & SWT 4
I Swing Wann invokeLater() verwenden? AWT, Swing, JavaFX & SWT 7
S AWT Eigenen Cursor im Frame verwenden... AWT, Swing, JavaFX & SWT 5
Yuen TableLayout verwenden / Classpath AWT, Swing, JavaFX & SWT 3
I Texteingabe des Benutzers in der GUI verwenden AWT, Swing, JavaFX & SWT 5
S Componente mehrmals verwenden ? AWT, Swing, JavaFX & SWT 3
H paint verwenden AWT, Swing, JavaFX & SWT 3
H JFileChooser richtig verwenden AWT, Swing, JavaFX & SWT 3
F Externes Look & Feel für Swing wie importieren/verwenden AWT, Swing, JavaFX & SWT 3
H JFileChooser im Applet verwenden AWT, Swing, JavaFX & SWT 2
B In einer JTextArea unterschiedliche Schriftarten verwenden? AWT, Swing, JavaFX & SWT 3
P Umlaute in GUI verwenden AWT, Swing, JavaFX & SWT 5
M Bilder als Link verwenden? AWT, Swing, JavaFX & SWT 3
P Fehler beim Verwenden von swt.jar mit NetBeans AWT, Swing, JavaFX & SWT 2
M Windows file icons in Java verwenden AWT, Swing, JavaFX & SWT 2
S das selbe JLabel öffters verwenden AWT, Swing, JavaFX & SWT 6
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
m@nu convertPoint richtig verwenden? AWT, Swing, JavaFX & SWT 2
A Klassenübergreifend MouseListener verwenden AWT, Swing, JavaFX & SWT 14
T JDialog als Optionen Fenster verwenden AWT, Swing, JavaFX & SWT 6
lin Welches Objekt für einen About-Dialog verwenden? AWT, Swing, JavaFX & SWT 2
G Bei JScrollpane statt Scrollbar eine Vorschau verwenden AWT, Swing, JavaFX & SWT 3
K JComboBox und JTextField zusammen verwenden AWT, Swing, JavaFX & SWT 3
D invalidate() - wie verwenden? AWT, Swing, JavaFX & SWT 2
A gif-Datei als Button verwenden AWT, Swing, JavaFX & SWT 4
G Listener mehrfach verwenden AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben