2011-01-15 3 views
1
public class download { 
    public static void Download() { 
     final String saveTo = System.getProperty("user.home").replace("\\", "/") + "/Desktop/"; 
     try { 
      URL url = null; 
      url = new URL("http://cachefly.cachefly.net/10mb.test"); 
      ReadableByteChannel rbc = Channels.newChannel(url.openStream()); 
      FileOutputStream fos = new FileOutputStream(saveTo + "10mb.test"); 
      fos.getChannel().transferFrom(rbc, 0, 1 << 24); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

In meiner anderen Klasse habe ich ein Ereignis-ListenerJava GUI eingefroren, wenn Datei herunterzuladen

public void download_buttonActionPerformed(ActionEvent e) { 
     download_button.setEnabled(false); 
     label_status.setText("- Downloading..."); 
     download.Download(); 
    } 

Wenn ich die Taste auf meiner GUI klicken Sie friert und das Etikett & Taste ändern nie, bis die Datei heruntergeladen

http://img200.imageshack.us/img200/2435/45019860.png

muss ich den Download auf einem neuen Thread oder etwas anfangen? Wenn ich es auf einem neuen Thread starte ist es immer noch möglich den Fortschrittsbalken zu benutzen? Ich bin immer noch neu in Java, also entschuldige ich mich, wenn ich das völlig falsch mache.

Antwort

7

Ja, Sie müssen den Download in einem separaten Thread durchführen. In der Tat können Sie einen Fortschrittsbalken verwenden.

Verwenden Sie einen SwingWorker, um die lange laufende Aufgabe auszuführen. Dieses Tutorial hilft mit dem Fortschrittsbalken: http://download.oracle.com/javase/tutorial/uiswing/components/progress.html

+0

Danke für den Link, es hilft wirklich. Ich schätze die Hilfe. – Kyle

2

Dies ist Java Swing-Programmierung 101. Wenn Sie Aufgaben ausführen, die eine lange Zeit dauern, müssen Sie diese Aufgaben in einem anderen Thread ausführen. Andernfalls wird Ihr UI-Thread pausieren und keine Ereignisse versenden, bis die Aufgabe erledigt ist. Werfen Sie einen Blick auf SwingWorker. So können Sie Threads erstellen und die Benutzeroberfläche aktualisieren, wenn sich etwas ändert.

2

Muss ich den Download auf einen neuen Thread oder etwas starten?

Ja. Ein SwingWorker wäre dafür perfekt.

Wenn ich es auf einem neuen Thread starte, ist es immer noch möglich, den Fortschrittsbalken zu verwenden?

Ja. Hast du das Swing-Tutorial für Fortschrittsbalken durchlaufen? Es wird gezeigt, wie Sie diese mit Beispielcode verwenden.

+0

Vielen Dank ^.^ – Kyle