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

时间:2014-04-10 15:31:15

标签: 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();
}

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>

1 个答案:

答案 0 :(得分:4)

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

我的猜测是,在首次构建场景图时,进度指示器不可见。要解决此问题,请从fxml文件中的visible="false"中删除ProgressIndicator属性,并将绑定包装在Platform.runLater(...)调用中:

public void initialize(...) {
    Platform.runLater(() -> loadingIndicator.visibleProperty().bind(isSaving));
}