【问题标题】:How to maintain ratio in values of JavaFX Spinner如何保持 JavaFX Spinner 值的比率
【发布时间】:2018-12-28 13:48:00
【问题描述】:

我的 JavaFX 应用程序中有两个微调器和一个切换按钮,我还将它们设置为可编辑

Spinner<Integer> hSelector = new Spinner<>(1,15000,1000,1);
Spinner<Integer> wSelector = new Spinner<>(1,15000,1000,1);
hSelector.setEditable(true);
wSelector.setEditable(true);
ToggleButton lock = new ToggleButton("lock");

When this lock toggle button is selected I want to maintain the ratio in values of hSelector and wSelector.所以我尝试了以下,

lock.selectedProperty().addListener((observable, oldValue, newValue) -> {
    if(newValue){
        hSelector.getValueFactory().valueProperty().addListener((ob, ov, nv) -> {
            wSelector.getEditor().setText(String.valueOf((nv * wSelector.getValue()) / ov));
        });
        wSelector.getValueFactory().valueProperty().addListener((ob, ov, nv) -> {
            hSelector.getEditor().setText(String.valueOf((nv * hSelector.getValue()) / ov));
        });
    }
});

但这并没有很好地工作。问题是,当lock 被选中并且我更改了一个微调器的值然后我只关注(通过单击微调器的文本字段)它们时,即使我不编辑它们,它们的值也会自动更改价值观。

现在,我的问题是,保持这些微调器的值比率的正确方法是什么?我的方法有什么问题?以及取消选中lock后如何去除保持比例的行为。

【问题讨论】:

    标签: java javafx logic javafx-11


    【解决方案1】:

    不要在每次切换按钮更改时添加新的侦听器。 “添加侦听器”是指该方法在字面上将侦听器添加到现有侦听器集,因此在编写代码时,如果用户选择切换按钮十次,则每个微调器上将有十个侦听器。

    正确的做法是为每个 Spinner 添加一个监听器。如果未选择切换按钮,则每个侦听器都不应执行任何操作。您需要将微调器值的比率保存在私有字段中,以供听众使用。

    private double ratio = 1;
    
    // ...
    
    lock.selectedProperty().addListener((observable, oldValue, newValue) -> {
        if (newValue) {
            hSelector.commitValue();
            wSelector.commitValue();
            ratio = (double) hSelector.getValue() / wSelector.getValue();
        }
    });
    
    hSelector.getValueFactory().valueProperty().addListener((ob, ov, nv) -> {
        if (lock.isSelected()) {
            wSelector.getValueFactory().setValue((int) (nv / ratio));
        }
    });
    wSelector.getValueFactory().valueProperty().addListener((ob, ov, nv) -> {
        if (lock.isSelected()) {
            hSelector.getValueFactory().setValue((int) (nv * ratio));
        }
    });
    

    【讨论】:

      【解决方案2】:

      您不想向selectedProperty 添加侦听器。相反,请侦听 Spinner 的更改。当值改变时,检查lock按钮是否被选中,然后进行计算:

          hSelector.valueProperty().addListener((observable, oldValue, newValue) -> {
              if (lock.isSelected()) {
                  wSelector.getValueFactory().setValue(newValue * wSelector.getValue() / oldValue);
              }
          });
          wSelector.valueProperty().addListener((observable, oldValue, newValue) -> {
              if (lock.isSelected()) {
                  hSelector.getValueFactory().setValue(newValue * hSelector.getValue() / oldValue);
              }
          });
      

      但是,您可能需要检查用于确定新比率的公式,因为它似乎无法正常工作;数学不是我的强项。但这应该让您的微调器在更改值时正确更新。

      【讨论】:

        猜你喜欢
        • 2016-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-07
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        相关资源
        最近更新 更多