【问题标题】:JavaFX ProgressBar/ProgressIndicator: listen for change from multiple SlidersJavaFX ProgressBar/ProgressIndicator:监听来自多个滑块的变化
【发布时间】:2016-11-29 20:51:46
【问题描述】:

情况:有多个滑块 |希望进度条随着每个滑块的移动而改变。现在只有一个滑块会移动进度条,但文本字段会显示所有数据。

有没有更好的方法来做到这一点?

这是我的代码:

@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

【问题讨论】:

  • 为什么需要多个滑块来控制一个ProgressBar?
  • 例如:如果我有 4 个滑块,我希望每个滑块代表进度条的 25%。当所有四个滑块都处于最大值时,所有四个滑块的组合将代表 100%。我特别想将这种格式用于我正在研究的视觉量具。

标签: java javafx data-binding progress-bar


【解决方案1】:

您可以简单地将ProgressIndicatorprogressProperty 绑定到Sliders 的valueProperty,同时记住指标的progressProperty 的边界是0 到1:

0 到 1 之间的正值表示进度百分比 其中 0 为 0%,1 为 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);

这将产生如下内容:

注意:如果将Sliders的边界从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()));

【讨论】:

  • 还有一个问题:我如何将它集成到场景构建器 xml 页面与 ...vbox.getChildren()addAll...?
  • 想通了:
  • 想出了解决办法: 1. 更新场景生成器中的边界 2. 然后绑定进度条和滑块
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 2017-11-23
  • 2016-08-25
  • 1970-01-01
  • 2015-07-17
  • 2020-02-01
  • 1970-01-01
  • 2018-04-06
相关资源
最近更新 更多