Mein Frame friert ein beim Uploaden

Jay_LP_

Aktives Mitglied
Hi,

ich habe folgendes Problem... Ich führe das Skript von unten nach einem Button-Klick aus. Dan friert das Frame solange ein bis es fertig ist und die Progressbar aktualisiert sich auch nicht... An einem anderen Ort im Quellcode friert es ebenfalls ein, kann mir wer helfen?

[CODE lang="java" title="Der FTP Zugang funktioniert"] String servername="website";
int port = 21;
String username="user";
String password="pw";

try {
FTPClient ftp = new FTPClient();

ftp.connect(servername,port);
ftp.login(username, password);

System.out.println("Verbunden");


ftp.setFileType(FTP.BINARY_FILE_TYPE);

File firstLocalFile = new File("ursprung");

CopyStreamListener listener = new CopyStreamListener() {

@Override
public void bytesTransferred(CopyStreamEvent event) {}


}

@Override
public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {

jProgressBar.setValue((int)(totalBytesTransferred*100/firstLocalFile.length()));
}


};

String firstRemoteFile = "Ziel";
InputStream inputStream = new FileInputStream(firstLocalFile);

System.out.println("Start uploading first file");
ftp.setCopyStreamListener(listener);

boolean done = ftp.storeFile(firstRemoteFile, inputStream);
inputStream.close();
if (done) {
System.out.println("The first file is uploaded successfully.");
}

}catch(IOException io) {
io.printStackTrace();
}[/CODE]
 
Das problem wird einfach sein, dass du Aktionen in dem UI Thread durchführst (Event Dispatch Thread ist der offizielle Name des Threads bei Swing). Dieser ist aber auch für die Aktualisierung der Oberfläche da und sollte daher nie für Dinge genutzt werden, die etwas länger laufen. Diese sollten immer in eigenständige Threads verlagert werden.

Die UI Frameworks haben in der Regel auch meist spezielle Klassen, die einen Hintergrundprozess mit regelmäßigen Aktualisierungen abdeckt. Bei Swing wäre das der SwingWorker. Tante Google wird Dir dazu bestimmt auch viele Einführungen und Beispiele geben können.
 
kann mir wer helfen?
Ja, ein Thread.

Der Event-Listener, der auf den Klick reagiert, läuft im UI-Thread, der für - Überraschung - das UI zuständig ist. Diesen Thread blockierst Du, deshalb kann das UI nicht aktualisiert werden und friert ein.

Die Lösung ist, lang dauernde Arbeiten in einem separaten Thread auszuführen. Wenn ich es richtig sehe, verwendest Du Swing, da heißt der UI-Thread "event dispatch thread" (EDT) und unter Swnig gibt es z. B. einen SwingWorker, mit dem Du Dir das Leben etwas einfacher machen kannst.
 

Zurück
Oben