【问题标题】:How to trigger a JavaFX event when all ListView CheckBoxes are checked?检查所有 ListView CheckBoxes 时如何触发 JavaFX 事件?
【发布时间】:2018-10-17 17:16:33
【问题描述】:

当 JFXListView 中的所有 JFXCheckBoxes 都被选中并且全部未选中时,我如何触发事件?

这是我的代码:

@FXML
private JFXListView li_se;

private void Services(ActionEvent e) {
        li_se.getItems().clear();
        for (int i = 0; i < R.OffrirService().size(); i++) {
            JFXCheckBox s = new JFXCheckBox(R.OffrirService().get(i));
            s.selectedProperty().addListener((obs, wasOn, isNowOn) -> {
                if (wasOn == false) {
                         //if checked do something                       
                } else {
                         //if unchecked do something
                }
                //System.out.println(s.getText() + " changed on state from " + wasOn + " to " + isNowOn);
            });
            li_se.getItems().add(s);
    }
}

【问题讨论】:

    标签: java listview javafx checkbox jfoenix


    【解决方案1】:

    您可以探索绑定。

    选择了 2 个复选框的示例:

    BooleanProperty bp = new SimpleBooleanProperty(false);
    CheckBox cb1 = new CheckBox();
    CheckBox cb2 = new CheckBox();
    bp.bind(Bindings.and(cb1.selectedProperty(), cb2.selectedProperty()));
    bp.addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
    
        }
    });
    

    对于多个 CheckBox,出现了一些奇怪的想法。我希望能解释一下。 主要思想如 unix chmod 000 - 无访问权限,777 - 所有访问权限。 例如,您有五个 CBox。让每一个都增加一些价值。 CB1 值 1
    CB2 值 2
    CB3 值 3
    CB4 值 4
    CB5值5

    并使用 someVariable 来存储所有选定 CBoxes 的总值。 未选择时:someVariable == 0。 全部选中时:someVariable == (1+2+3+4+5)

      IntegerProperty checkedNumbers = new SimpleIntegerProperty(0);
        checkedNumbers.addListener(new javafx.beans.value.ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
                if (newValue == 0) {
                    //doSomething
                } else if (newValue == (1 + 2 + 3 + 4 + 5)) {
                    //doSomethingElse
                }
            }
        });
        int cBoxNumbers = 5;
    
        //Implement same ChangeListener for every CBoxes based on different UserData.
        //When CB selected, add its value to checkedNumbers
        //When unselected - subtract
        ChangeListener changeListener;
    
        for (int i = 1; i <= cBoxNumbers; i++) {
            CheckBox cb1 = new CheckBox();
            cb1.setUserData(i);
            cb1.selectedProperty().addListener(changeListener);
        }
    

    【讨论】:

    • 如何绑定动态数量的 JFXCheckBox?
    • 谢谢你的想法。我能够像下面的答案一样做到这一点。
    【解决方案2】:
    @FXML
    private JFXListView li_se;
    
    int d;
    
    @FXML
    private void Services(ActionEvent e) {
        try {
            li_se.getItems().clear();
            for (int i = 0; i < R.OffrirService().size(); i++) {
                JFXCheckBox s = new JFXCheckBox(R.OffrirService().get(i));
                s.selectedProperty().addListener((obs, wasOn, isNowOn) -> {
                    if (wasOn == false) {
                        //if checked do something
                        d++;
                            if (d == R.OffrirService().size()) {
                                //if all checked do something
                            }
                    } else {
                        //if unchecked do something
                        d--;
                            if (d == 0) {
                                //if all unchecked do something
                            }
                    //System.out.println(s.getText() + " changed on state from " + wasOn + " to " + isNowOn);
                });
                li_se.getItems().add(s);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2013-07-31
      • 2014-04-01
      相关资源
      最近更新 更多