在JavaFx ListView中获取所选CheckBox的文本

时间:2014-06-10 11:44:20

标签: listview checkbox javafx listener checkboxlist

我已经创建了一个示例项目来学习如何在ListView中使用复选框。

当我选中一个复选框时,我想打印出它的值(即复选框标签上的文本值)。

现在发生的事情是我选择一个复选框,例如第5行,打印出来:
第5行

当我继续选择第7行的复选框时,将打印出以下内容:
第5行 第7行

所以,所有打印出的整体看起来都是这样的:
ROW5
Row5< - 不应该打印出来!
ROW7

正如您所看到的,问题是当我选中一个复选框时,将打印出所选的所有复选框。

同样如果我取消选中第7行,我想要打印出只有第7行未经检查。但现在,所有未选中的复选框都会打印出来。

package listviewtest;

    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.control.cell.CheckBoxListCell;
    import javafx.util.Callback;
    import javafx.util.StringConverter;

    public class SubGuiController implements Initializable {
        @FXML private ListView listView;
        @FXML private Button btnUnselectAll;
        @FXML private Button btnSelectAll;
        @FXML private Label lblSelected;

        /**
         * Initializes the controller class.
         */
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            final ObservableList<CheckBoxHandler> data = FXCollections.observableArrayList();

            for(int i=0; i<10; i++) {
                data.add(new CheckBoxHandler(false, "Row " + i));
            }

                ChangeListener<Boolean> listener = new ChangeListener<Boolean>() {

                    @Override
                    public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldValue, Boolean selected) {

                        // In this loop, we get all selected/unselected checkboxes...
                        for (CheckBoxHandler cbh : data) {

                            if (selected) {
                                if (cbh.getSelected()) {
                                    System.out.println("selected: " + cbh.getCheckBoxText() + ": " + cbh.getSelected());
                                }
                            }
                            else if (!selected) {
                                if (!cbh.getSelected()) {
                                    System.out.println("unselected: " + cbh.getCheckBoxText());
                                }
                            }
                        }
                    }
                };

                for(CheckBoxHandler cbh: data) {
                    cbh.selectedProperty().addListener(listener);
                }

            listView.setItems(data);
    }

1 个答案:

答案 0 :(得分:0)

为每个CheckBoxHandler添加不同的侦听器:

for (final CheckBoxHandler cbh : data) {
    cbh.selectedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(ObservableValue<? extends Boolean> obs, Boolean wasSelected, Boolean isSelected) {
            if (isSelected) {
                System.out.println("selected: "+cbh.getCheckBoxText());
            } else {
                System.out.println("unselected: "+cbh.getCheckBoxText());
            }
        }
    });
}