JavaFX ProgressIndicator dreht sich nicht

Tort-E

Mitglied
Hallo liebe Java-Gemeinde!

Ich bin schon am verzweifeln...
In einer TreeView werden große Daten aus einer Datenbank geladen und dargestellt. Da der User ca. 1-3 Sekunden (ggf. auch etwas länger) auf die Daten warten muss, möchte ich ein optisches Feedback geben.

Das Problem ist, dass sich der ProgressIndicator gar nicht dreht (Intermediate ist gesetzt). Könnt Ihr mir helfen??

Ich habe daher in meiner Controller-Klasse in der Methode initialize(...) folgenden Code:
Code:
@FXML TreeView treeViewMandantTaetigkeit;
    @FXML ProgressIndicator progressIndicator;
    private BooleanProperty isSaving = new SimpleBooleanProperty(true);
   
   
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        progressIndicator.visibleProperty().bind(isSaving);
        new Thread() {
            public void run() {
                Platform.runLater(new Runnable() {
                    public void run() {
                       
                        try {
                            Thread.sleep(100);
                            setupTreeView();
                        } catch (InterruptedException ex) {
                            Logger.getLogger(FkConsoleTaetigkeitMandantController.class.getName()).log(Level.SEVERE, null, ex);
                        }
                       
                    }
                });
            }
        }.start();
         
       
    }
 
Ich habe es jetzt folgendermaßen gelöst:
Code:
    @Override
    public void initialize(URL url, ResourceBundle rb) {
            Task task = new Task<Void>() {
                @Override
                protected Void call() throws Exception {
                    setupTreeView();
                    Thread.sleep(100);
                    return null;
                }
                   
            };
            progressIndicator.visibleProperty().bind(task.runningProperty());
            new Thread(task).start();
           
    }

Problem ist jetzt, dass ich eine Exception bekomme: Exception in thread "Thread-6" java.lang.IllegalStateException: Not on FX application thread;😡😡😡😡😡
 
Problem 1) Indicator dreht nicht:
Das ist komisch, denn bei mir tut er das. Hier mal ein paar Snippets.

HTML:
        <VBox fx:id="vboxWait">
            <ProgressIndicator fx:id="piWait" VBox.vgrow="ALWAYS">
                <VBox.margin>
                    <Insets top="25"/>
                </VBox.margin>
            </ProgressIndicator>
            <Label fx:id="labelTaskMsg" text="%serverlist.task.msg" alignment="BOTTOM_CENTER">
                <maxWidth><Double fx:constant="MAX_VALUE" /></maxWidth>
                <VBox.margin>
                    <Insets top="25"/>
                </VBox.margin>
            </Label>
        </VBox>

Java:
    @FXML
    private ProgressIndicator piWait;

    // nichts weiter, nur wenn mein javafx.concurrent.Task, der Daten vom Netz lädt, fertig ist, wird der Indicator auf invisible gesetzt...

Problem 2) Exception. Das Problem ist, dass du versucht, die UI von einem anderen Thread (eben deinem Mini-Thread) zu verändern. Das geht nicht. Du kannst Operationen auf der UI nur vom UI-/Main-Thread aus machen. Dafür gibt es die Methode
Java:
Platform.runLater(Runnable)
.
 

Zurück
Oben