JavaFX ProgressBar/ProgressIndicator:监听来自多个滑块的变化
JavaFX ProgressBar/ProgressIndicator: listen for change from multiple Sliders
情况: 有多个滑块 |希望进度条随着每个滑块的移动而改变。现在只有一个滑块会移动进度条,但文本字段会显示所有数据。
有更好的方法吗?
这是我的代码:
@FXML
ProgressIndicator pb;
@FXML
Slider slider1, slider2, slider3, slider4, slider5, slider6, slider7, slider8;
@Override
public void initialize(URL location, ResourceBundle resources) {
field.textProperty().bind(Bindings.concat(
slider1.valueProperty()
.add(slider2.valueProperty()
.add(slider3.valueProperty()
.add(slider4.valueProperty()
.add(slider5.valueProperty()
.add(slider6.valueProperty()
.add(slider7.valueProperty()
.add(slider8.valueProperty())))))))));
slider1.valueProperty().addListener(
(ObservableValue<? extends Number> ov, Number old_val,
Number new_val) -> {
//sets the Progress bar to new value
pb.setProgress(new_val.doubleValue());
});
}
}
slider example
您可以简单地将 ProgressIndicator
的 progressProperty
绑定到 Slider
的 valueProperty
,同时记住 progressProperty
指标具有 0 到 1 的边界:
A positive value between 0 and 1 indicates the percentage of progress
where 0 is 0% and 1 is 100%.
例子:
Slider slider1 = new Slider(0d, 1d, 0d);
Slider slider2 = new Slider(0d, 1d, 0d);
Slider slider3 = new Slider(0d, 1d, 0d);
Slider slider4 = new Slider(0d, 1d, 0d);
ProgressIndicator pi = new ProgressIndicator();
pi.progressProperty().bind(slider1.valueProperty().divide(4d).add(slider2.valueProperty().divide(4d))
.add(slider3.valueProperty().divide(4d)).add(slider4.valueProperty().divide(4d)));
VBox vbox = new VBox();
vbox.getChildren().addAll(slider1, slider2, slider3, slider4, pi);
这将产生如下内容:
注意: 如果将 Slider
的边界更新为从 0 到 0.25,绑定就更简单了:
Slider slider1 = new Slider(0d, 0.25d, 0d);
Slider slider2 = new Slider(0d, 0.25d, 0d);
Slider slider3 = new Slider(0d, 0.25d, 0d);
Slider slider4 = new Slider(0d, 0.25d, 0d);
ProgressIndicator pi = new ProgressIndicator();
pi.progressProperty().bind(slider1.valueProperty().add(slider2.valueProperty())
.add(slider3.valueProperty()).add(slider4.valueProperty()));
情况: 有多个滑块 |希望进度条随着每个滑块的移动而改变。现在只有一个滑块会移动进度条,但文本字段会显示所有数据。
有更好的方法吗?
这是我的代码:
@FXML
ProgressIndicator pb;
@FXML
Slider slider1, slider2, slider3, slider4, slider5, slider6, slider7, slider8;
@Override
public void initialize(URL location, ResourceBundle resources) {
field.textProperty().bind(Bindings.concat(
slider1.valueProperty()
.add(slider2.valueProperty()
.add(slider3.valueProperty()
.add(slider4.valueProperty()
.add(slider5.valueProperty()
.add(slider6.valueProperty()
.add(slider7.valueProperty()
.add(slider8.valueProperty())))))))));
slider1.valueProperty().addListener(
(ObservableValue<? extends Number> ov, Number old_val,
Number new_val) -> {
//sets the Progress bar to new value
pb.setProgress(new_val.doubleValue());
});
}
}
slider example
您可以简单地将 ProgressIndicator
的 progressProperty
绑定到 Slider
的 valueProperty
,同时记住 progressProperty
指标具有 0 到 1 的边界:
A positive value between 0 and 1 indicates the percentage of progress where 0 is 0% and 1 is 100%.
例子:
Slider slider1 = new Slider(0d, 1d, 0d);
Slider slider2 = new Slider(0d, 1d, 0d);
Slider slider3 = new Slider(0d, 1d, 0d);
Slider slider4 = new Slider(0d, 1d, 0d);
ProgressIndicator pi = new ProgressIndicator();
pi.progressProperty().bind(slider1.valueProperty().divide(4d).add(slider2.valueProperty().divide(4d))
.add(slider3.valueProperty().divide(4d)).add(slider4.valueProperty().divide(4d)));
VBox vbox = new VBox();
vbox.getChildren().addAll(slider1, slider2, slider3, slider4, pi);
这将产生如下内容:
注意: 如果将 Slider
的边界更新为从 0 到 0.25,绑定就更简单了:
Slider slider1 = new Slider(0d, 0.25d, 0d);
Slider slider2 = new Slider(0d, 0.25d, 0d);
Slider slider3 = new Slider(0d, 0.25d, 0d);
Slider slider4 = new Slider(0d, 0.25d, 0d);
ProgressIndicator pi = new ProgressIndicator();
pi.progressProperty().bind(slider1.valueProperty().add(slider2.valueProperty())
.add(slider3.valueProperty()).add(slider4.valueProperty()));