# Dateien kopieren mit ProgressBar



## S.T.O.R.M. (29. Mrz 2010)

Hallo zusammen,

ich beschäftige mich erst seit Kurzem mit der Java-GUI. Ich habe ein Programm, mit dem ich Ordner kopieren kann. Da diese recht groß sind, dauert der Vorgang relativ lange. Weil ich nicht möchte, dass der User denkt, das Programm wäre abgestürzt o.ä., würde ich gerne eine ProgressBar einbinden. Kann mir jemand helfen, wie das geht? Ich benutze NetBeans.

Hier der Code zum kopieren: 


```
public void copyDir(File quelle, File ziel) throws FileNotFoundException, IOException {

  File[] files = quelle.listFiles();
  File newFile = null;
  ziel.mkdirs(); // Erstellt alle benötigten Ordner
  if (files != null) {
    for (int i = 0; i < files.length; i++) {
      newFile = new File(ziel, files[i].getName());
      if (files[i].isDirectory()) {
        copyDir(files[i], newFile);
      }
      else {
        copyFile(files[i], newFile);
      }
    }
  }
}

public void copyFile(File file, File target) throws FileNotFoundException, IOException {

  FileChannel in = new FileInputStream(file).getChannel();
  FileChannel out = new FileOutputStream(target).getChannel();
  in.transferTo(0, file.length(), out);
  in.close();
  out.close();
}
```


----------



## SlaterB (29. Mrz 2010)

schau dir diesen FAQ-Beitrag an:
http://www.java-forum.org/bilder-gu...-progressbars-algorithmen-multithreading.html

vielleicht zuviel auf einmal, aber besser als zuwenig Kenntnisse,
im Internet findet man auch Beispiele
A demonstration of the JProgressBar component : ProgressBarSwing JFCJava
How to Use Progress Bars (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## S.T.O.R.M. (29. Mrz 2010)

Danke für die Links!

Da ich nicht weiß, wie lange der Prozess dauert, habe ich mich für _setIndeterminate_ entschieden. Das Ganze sieht bei mir jetzt so aus:


```
progress.setIndeterminate(true);
            x.copyDir(quelle, ziel);
            progress.setIndeterminate(false);
```

Allerdings bleibt der Balken einfach bei Kopiervorgang stehen.. er bewegt sich nicht mehr hin und her. Was muss ich ändern?


----------



## SlaterB (30. Mrz 2010)

kommt auf das das Gesamtprogramm an,
im FAQ-Link wird besonders darauf hingewiesen, dass die Aktion nebenläufig in einem eigenen Thread stattfinden muss,
in den Beispielen ist es überall korrekt und wenn es im main-Thread selber abläuft,
aus einem ActionListener gestartet wäre aber ohne neuen Thread der AWT-Thread beschäftigt, solange der kopiert wird nichts neu gezeichnet


----------



## S.T.O.R.M. (30. Mrz 2010)

Also ich starte alles in einer "ActionPerformed". Dort rufe ich die copy-Methode auf und habe davor die progressbar auf true gesetzt. Anschließened setze ich sie false. 
Wo muss ich jetzt was ändern? Habe es aus den Beispielen nicht richtig verstanden. Muss ich mit invokelater etc. arbeiten?!


----------



## SlaterB (30. Mrz 2010)

die langandauernde Kopier-Aktion muss in einen separaten Thread


```
Runnable r = new Runnable() {
  public void run() {
     // Code
  }
}
new Thread(r).start();
```


und wenn dann dieser separate Thread GUI-Daten wie den Progress-Status ändern will,
dann sollten diese einzelnen Befehle per invokelater ausgeführt werden, richtig


----------



## S.T.O.R.M. (31. Mrz 2010)

Ok, vielen Dank!


----------

