带有progressindicator的JavaFX Thread没有旋转,在非FXThread中完成工作

sim*_*des 5 java multithreading javafx

我想用JavaFX progressindicator指出一个加载过程.问题是当代码第一次执行时指示器不旋转.在第二次旋转时,意味着绑定正在工作,包括disable和visible-property.

我也改变了FX线程中的状态,并在一个单独的线程上完成工作,所以我在这里看不到任何错误.

有谁看到这个问题?

控制器:

//vars
@FXML private ProgressIndicator loadingIndicator;
private BooleanProperty isSaving = new SimpleBooleanProperty(false);

@Override
public void initialize(URL location, ResourceBundle resources) {
    parentToDisable.disableProperty().bind(isSaving);
    loadingIndicator.visibleProperty().bind(isSaving);
}


@FXML
void onSave(ActionEvent event) {
    isSaving.set(true);            //<<<<<<<<<problem
    // separate non-FX thread
    new Thread() {
        // runnable for that thread
        public void run() {

//++++++++++//long running task......+++++++++++++++

            // update ProgressIndicator on FX thread
            Platform.runLater(new Runnable() {
                public void run() {
                    isSaving.set(false);  //<<<<<<<<<problem
                }
            });
        }
    }.start();
}
Run Code Online (Sandbox Code Playgroud)

FXML:

<ScrollPane fitToHeight="true" fitToWidth="true" prefHeight="600.0"
    prefWidth="500.0" xmlns="http://javafx.com/javafx/8" 
    xmlns:fx="http://javafx.com    
    /fxml/1">
    <content>
        <StackPane>
            <children>
                <VBox fx:id="parentToDisable">
                    <!-- shortened -->
                    <Button fx:id="btnSave" mnemonicParsing="false" onAction="#onSave"
                        text="Speichern" />
                    <!-- shortened -->
                </VBox>
                <ProgressIndicator fx:id="loadingIndicator"
                    maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
                    minWidth="-Infinity" prefHeight="60.0" prefWidth="60.0" 
                    visible="false" />
            </children>
        </StackPane>
    </content>
</ScrollPane>
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 4

这看起来像一个错误:RT-33261。它似乎在最新的 JDK 8u20 预发行版中得到了修复。

我的猜测是,这与首次构建场景图时进度指示器不可见有关。作为解决方法,请visible="false"从 fxml 文件中删除该属性ProgressIndicator,并将绑定包装在调用中Platform.runLater(...)

public void initialize(...) {
    Platform.runLater(() -> loadingIndicator.visibleProperty().bind(isSaving));
}
Run Code Online (Sandbox Code Playgroud)