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)
这看起来像一个错误: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)
| 归档时间: |
|
| 查看次数: |
1695 次 |
| 最近记录: |