# Frage zu ProgressBar, SwingWorker etc.



## kale1990 (11. Dez 2008)

Hallo, ich habe ein Programm mit welchem ich Dateien zum Server hochladen kann.
Die Client-Server-Kommunikation ist eine eigene Klasse. Zum Hochladen von Dateien gibt es eine Methode in dieser statischen Klasse: UploadFile();

Diese Methode wird nun aufgerufen wenn ein Formular ausgefüllt ist, in dem die Datei etc. angegeben ist.
Nun möchte ist das während des hochladens ein Fenster erscheint das eine ProgressBar anzeigt. 
Die Klasse mit der ProgressBar habe ich schon mal erstellt:


```
public class ProgressBarWindow  extends JDialog
									implements PropertyChangeListener {
	
	private JProgressBar progressBar;
    private Task task;

    class Task extends SwingWorker<Void, Void> {
        /*
         * Main task. Executed in background thread.
         */
        @Override
        public Void doInBackground() {
            
//            Hier sollte irgendwie Code ausgeführt werden

            return null;
        }

        /*
         * Executed in event dispatching thread
         */
        @Override
        public void done() {
            Toolkit.getDefaultToolkit().beep();
            setCursor(null); //turn off the wait cursor
        }
    }

    public ProgressBarWindow() {
        super((Frame)TibisClient.cParent,true);

        //Create the UI

        progressBar = new JProgressBar(0, 100);
        progressBar.setValue(0);
        progressBar.setStringPainted(true);

        JPanel panel = new JPanel();
        panel.add(progressBar);

        add(panel, BorderLayout.PAGE_END);

        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        
        task = new Task();
        task.addPropertyChangeListener(this);
        task.execute();

        this.setSize(TibisConstants.COOKIE_MODAL_WIN_SIZE);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        this.setVisible(true);

    }

    /**
     * Invoked when task's progress property changes.
     */
    public void propertyChange(PropertyChangeEvent evt) {
        if ("progress" == evt.getPropertyName()) {
            int progress = (Integer) evt.getNewValue();
            progressBar.setValue(progress);
        } 
    }

}
```


ich kann das ganze auch schon verwenden mit:


```
javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
    			ProgressBarWindow pbw = new ProgressBarWindow();
            }
```


nur weiß ich nicht wie ich jetzt die Methode UploadFile mit den ganzen parametern nach doInBackground bekomme?!? da ich die klasse progressbarwindow ja auch nicht nur für uploadfile verwenden möchte?!


----------



## SlaterB (11. Dez 2008)

schau dir an wie SwingUtilities.invokeLater() das macht:
da wird ein Runnable mit beliebig komplexer Logik (hier nur: ProgressBarWindow starten) erstellt und an invokeLater() übergeben,

invokeLater() muss später bei der Ausführung nicht wissen, was für einen seltsamen Code es ausführen muss, 
es weiß, dass es ein Runnable-Objekt ist und dass man da run() aufrufen kann,
das wird invokeLater() später (later) machen und alles ist gut

genauso kannst du das mit ProgressBarWindow auch machen,
übergib ein beim Aufrufer definiertes Runnable-Objekt, oder ein Objekt irgendeines anderen Interfaces mit einer einfachen jetztGehtsLos()-Methode,
nicht als Thread starten sondern nur die Arbeit ausführen


----------



## kale1990 (11. Dez 2008)

den letzten abschnitt, also:



> genauso kannst du das mit ProgressBarWindow auch machen,
> übergib ein beim Aufrufer definiertes Runnable-Objekt, oder ein Objekt irgendeines anderen Interfaces mit einer einfachen jetztGehtsLos()-Methode,
> nicht als Thread starten sondern nur die Arbeit ausführen



versteh ich noch nicht ganz


EDIT:   So jetz nach einigen malen lesen des letzen abschnitts hab ich ihn verstanden!! und es funktioniert! danke


----------



## SlaterB (11. Dez 2008)

eine grundsätzliche Alternative ist ansonsten immer,
direkt die Klasse ProgressBarWindow  zu überschreiben,

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
            public void run() { 
             ProgressBarWindow pbw = new ProgressBarWindow() {

       public void work() {
....
 }
}
            } 
            }
);


oder du hast ja jetzt schon eine Klasse Task in ProgressBarWindow , die kann dann überschrieben werden,
oder oder, viele Möglichkeiten bzw. immer nur die gleiche in ein paar Varianten


----------



## kale1990 (11. Dez 2008)

jap danke nochmal...hab n bisschen gebraucht bis ich es kapiert habe! aber es funktioniert jetzt wunderbar!!


----------

