Label im JavaFX Thread Updaten

Bitte aktiviere JavaScript!
Hallo zusammen,


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?
 
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.
Alle Änderungen, die das UI betreffen, müssen im UI-Thread ausgeführt werden. Platform.runLater sorgt dafür, dass das übergebene Runnable im UI-Thread ausgeführt wird.

Wenn ich mir das aber auf der Oberfläche in einem Label ausgeben lasse, dann kommt der mit dem aktualisieren, nicht mehr hinterher.
Kein Wunder, wenn Du nach jedem Byte aktualisierst. Lies über einen Puffer ein (z. B. in ein byte[] buf = new byte[8192];) und aktualisiere das Label nur, wenn es etwas zu aktualisieren gibt. (BTW: kann sein, dass es für JavaFX bereits fertige Lösungen gibt; da müsstest Du mal warten, bis sich einer der JavaFX-Freaks meldet).

Nachtrag: und verwende try-with-resources...
 
Alle Änderungen, die das UI betreffen, müssen im UI-Thread ausgeführt werden. Platform.runLater sorgt dafür, dass das übergebene Runnable im UI-Thread ausgeführt wird.


Kein Wunder, wenn Du nach jedem Byte aktualisierst. Lies über einen Puffer ein (z. B. in ein byte[] buf = new byte[8192];) und aktualisiere das Label nur, wenn es etwas zu aktualisieren gibt. (BTW: kann sein, dass es für JavaFX bereits fertige Lösungen gibt; da müsstest Du mal warten, bis sich einer der JavaFX-Freaks meldet).

Nachtrag: und verwende try-with-resources...
Okay.
Ja, hab auch schon gemerkt das ich nicht mit voller Bandbreite herunterlade.
Jetzt geht es deutlich schneller:D

Müsste doch ziemlich zu diesem Thread hier passen.
Wenn man zu doof ist um die Suchfunktion zu benutzen:rolleyes:
Danke das Hilft mir weiter :)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben