Hallo zusammen,
ich hab eine Frage zu JavaFX und der
Wenn ich das richtig Verstanden habe, kann ich dem über die Funktion etwas mitgeben, was er dann irgendwann macht.
Also eignet sich das am besten, wenn man etwas auf der Oberfläche aktualisieren möchte.
Jetzt ist es so das ich eine JavaFX Anwendung habe und die Lädt eine Datei herunter.
Das mit dem herunterladen funktioniert, aber ich will mir jetzt auf der Oberfläche anzeigen lassen wie viel KB bereits heruntergeladen wurde und wie groß die Datei ist.
Das ist auch kein Problem, sprich, wenn ich mir das in der Konsole ausgeben lasse, läuft es ohne Probleme.
Wenn ich mir das aber auf der Oberfläche in einem Label ausgeben lasse, dann kommt der mit dem aktualisieren, nicht mehr hinterher.
Das ist meine Methode:
Und aufgerufen wird das ganze so:
Ich denk mal, dass ich ein Problem mit dem Threads hab.
Auf was muss ich achten, dass er das Label "richtig" aktualisiert?
ich hab eine Frage zu JavaFX und der
Platform.Runlater
Funktion.Wenn ich das richtig Verstanden habe, kann ich dem über die Funktion etwas mitgeben, was er dann irgendwann macht.
Also eignet sich das am besten, wenn man etwas auf der Oberfläche aktualisieren möchte.
Jetzt ist es so das ich eine JavaFX Anwendung habe und die Lädt eine Datei herunter.
Das mit dem herunterladen funktioniert, aber ich will mir jetzt auf der Oberfläche anzeigen lassen wie viel KB bereits heruntergeladen wurde und wie groß die Datei ist.
Das ist auch kein Problem, sprich, wenn ich mir das in der Konsole ausgeben lasse, läuft es ohne Probleme.
Wenn ich mir das aber auf der Oberfläche in einem Label ausgeben lasse, dann kommt der mit dem aktualisieren, nicht mehr hinterher.
Das ist meine Methode:
Java:
private void ladeUpdate(URL url) {
try {
URLConnection connection = url.openConnection();
connection.setDoInput(true);
connection.setUseCaches(false);
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
File f = new File("NeueDatei.jar");
FileOutputStream fos = new FileOutputStream(f);
int by = 0;
long size = (connection.getContentLengthLong() / 1000);
DecimalFormat df = new DecimalFormat("#.##");
while ((by = bis.read()) != -1) {
long geladen = (f.length() / 1000);
long prozent = geladen * 100 / size;
Platform.runLater(() -> { //Hier wird das Platform.runLater aufgerufen um das Label zu aktualisieren
updateLabel.setText("Geladen: " + geladen + " KB\tVon: " + size + " KB (" + df.format(prozent) + "%)");
});
System.out.println("Geladen: " + geladen + " KB\tVon: " + size + " KB (" + df.format(prozent) + "%)");
fos.write(by);
}
} catch (IOException e) {
e.printStackTrace();
}
}
Und aufgerufen wird das ganze so:
Java:
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
executor.submit(this::ladeUpdate);
Ich denk mal, dass ich ein Problem mit dem Threads hab.
Auf was muss ich achten, dass er das Label "richtig" aktualisiert?