【发布时间】:2015-10-05 10:02:38
【问题描述】:
在实现 JavaFX 进度条/指示器的progressProperty绑定时,任务或 JavaFX 时间线之间是否存在“首选”方法?
例如,此代码加载一个屏幕,其中包含由按钮触发的 2 个进度条。一个 (progressBar) 的进度受任务约束,而另一个 (progressBar2) 受时间线约束。
public class TaskTest extends Application {
public static void main(String[] args) throws Exception { launch(args); }
public void start(final Stage stage) throws Exception {
final Button runButton = new Button("Run");
final ProgressBar progressBar = new ProgressBar();
final ProgressBar progressBar2 = new ProgressBar();
Integer START_TIME = 11;
Timeline timeline = new Timeline();
IntegerProperty timeSeconds = new SimpleIntegerProperty((START_TIME) * 100);
runButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
final Task task = new Task<Object>() {
@Override
protected Object call() throws InterruptedException {
for (int i = 0; i < 11; i++) {
Thread.sleep(1000);
updateProgress(i+1, 11);
}
return true;
}
};
runButton.disableProperty().bind(task.runningProperty());
progressBar.progressProperty().bind(task.progressProperty());
task.stateProperty().addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue<? extends Worker.State> observableValue, Worker.State oldState, Worker.State newState) {
if (newState == Worker.State.SUCCEEDED) {
System.out.println("This is ok, this thread " + Thread.currentThread() + " is the JavaFX Application thread.");
runButton.setText("Voila!");
}
}
});
new Thread(task).start();
//Timeline
progressBar2.progressProperty().bind(timeSeconds.divide((START_TIME) * 100.0).subtract(1).multiply(-1));
if (timeline != null){
timeline.stop();
}
timeSeconds.set((START_TIME) * 100);
timeline.getKeyFrames().add(
new KeyFrame(Duration.seconds(START_TIME), new KeyValue(timeSeconds, 0)));
timeline.playFromStart();
timeline.setOnFinished(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {
System.out.println("DONE");
}
});
}
});
VBox layout = new VBox();
layout.getChildren().addAll(runButton,progressBar,progressBar2);
layout.setStyle("-fx-background-color: cornsilk; -fx-padding:10; -fx-font-size: 16;");
Scene scene = new Scene(layout);
stage.setScene(scene);
stage.show();
}
}
progressBar2 比progressBar 有更多的'flow',后者在'块'中更新。这可以通过简单地更改减少 `Thread.sleep(1000)' 的值来防止。这是好习惯吗?
在我看来,使用时间线比使用任务更简单、更有效。
我应该使用什么,更重要的是为什么?
【问题讨论】:
标签: java javafx progress-bar