【问题标题】:Implement Select All on CheckListView JavaFX在 CheckListView JavaFX 上实现全选
【发布时间】:2017-12-30 18:25:05
【问题描述】:

我有一个显示自定义对象列表的 CheckListView。我正在尝试实现全选/全选选项,但是列表视图没有改变。复选框仅在单击时才会更改

 pendingUsers_listView.setCellFactory(new Callback<ListView<User>, javafx.scene.control.ListCell<User>>() {
        @Override
        public ListCell<User> call(ListView<User> listView) {
            return new PendingUserCell();
        }
    });

自定义单元格:

public class PendingUserCell extends CheckBoxListCell<User> {

    PendingUserCell() {
        this.setSelectedStateCallback(new Callback<User, ObservableValue<Boolean>>() {
            @Override
            public ObservableValue<Boolean> call(User param) {

                return new SimpleBooleanProperty(param.isApproved());
            }
        });
    }

    @Override
    public void updateItem(User u, boolean empty) {
        super.updateItem(u, empty);

        if (empty) {
            this.setText(null);

        } else {

            this.setText(u.getFullName() + " ( " + u.getEmail() + " )");

        }
    }

}

这些是负责操作的函数

 public void handleSelectAll() {
       this.pendingUsers_listView.getCheckModel().checkAll();
       this.pendingUsers_listView.refresh();
}

public void handleSelectNone() {
this.pendingUsers_listView.getCheckModel().clearChecks();
this.pendingUsers_listView.refresh();
}

【问题讨论】:

    标签: java listview user-interface javafx


    【解决方案1】:

    解决方法如下:

    我有一个 Model 类,它包含有关 ListView 中项目的信息,我放了一个名称,显示在 lisview 中,以及一个保存选中/未选中值的布尔属性,如下所示:

     public class Model {
    
        private StringProperty name;
        private BooleanProperty selected;
    
        public Model(String name, Boolean selected) {
            this.name = new SimpleStringProperty(name);
            this.selected = new SimpleBooleanProperty(selected);
        }
    
        public String getName() {
            return name.get();
        }
    
        public StringProperty nameProperty() {
            return name;
        }
    
        public boolean isSelected() {
            return selected.get();
        }
    
        public BooleanProperty selectedProperty() {
            return selected;
        }
    }
    

    然后我做了一个自定义StringConverter 将模型转换为字符串,以便在listView 中显示文本,如下所示:

    public class ModelConverter extends StringConverter<Model> {
        @Override public String toString(Model object) {
            return object.getName();
        }
    
        @Override public Model fromString(String string) {
            return null;
        }
    }
    

    然后在控制器中,我将一些项目添加到listView,并将其作为第一个元素全选,并为其添加一个侦听器。因此,如果您选中它,所有项目都会被选中,如果您取消选中它,那么所有项目都会被选中。代码如下:

    public class TestController implements Initializable {
    
        @FXML
        private ObservableList<Model> data = FXCollections.observableArrayList();
        @FXML
        private ListView<Model> listView;
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
            listView.setItems(data);
            listView.setCellFactory(factory -> new CustomListCell(Model::selectedProperty, new ModelConverter()));
            data.addAll(new Model("Select All", false), new Model("Apple", false), new Model("Orange", false),
                    new Model("Peach", false));
            data.get(0).selectedProperty().addListener(
                    (observable, oldValue, newValue) -> data.forEach(item -> item.selectedProperty().set(newValue)));
        }
    
    }
    

    所以我尽可能简单,通过使用 listView 中的一项,但您可以使用多种方法来选择全部选择无,例如在 listView 之外定义两个单独的 checkboxes,或一个 @ 987654331@ 或者你想要的其他东西,重要的是为你想要使用它的相应组件添加一个侦听器来选择全部选择无,然后我认为一切都变得容易了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 2012-05-02
      • 2017-04-16
      • 2017-05-04
      • 2012-11-28
      • 2018-05-04
      相关资源
      最近更新 更多