在 CheckListView JavaFX 上实现全选

Posted

技术标签:

【中文标题】在 CheckListView JavaFX 上实现全选【英文标题】:Implement Select All on 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();

【问题讨论】:

【参考方案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@ 或者你想要的其他东西,重要的是为你想要使用它的相应组件添加一个侦听器来选择全部选择无,然后我认为一切都变得容易了。

【讨论】:

以上是关于在 CheckListView JavaFX 上实现全选的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 JAVAFX 上实现像“渲染”这样的属性?

无法访问类 com.sun.javafx.util.Utils(在模块 javafx.graphics 中)-JavaFX 和 Eclipse

JavaFX概览

javafx如何在同一个面板界面切换

即使在eclipse中安装javafx后我也无法运行javafx程序[重复]

什么是JavaFX