在CheckListView JavaFX上实现Select All

时间:2017-07-25 02:29:26

标签: java listview user-interface javafx

我有一个CheckListView,它显示了一个自定义对象列表。我正在尝试实现select all / select none选项,但列表View不会更改。复选框仅在单击时更改

 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 个答案:

答案 0 :(得分:0)

这是解决方案:

我有一个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来将Model转换为String,以便在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添加了一些项目,我将第一个元素选为All,并为其添加一个监听器。因此,如果您检查所有项目都已检查,如果您取消选中它,则所有项目都将取消选中。这是代码:

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中的一个项目尽可能简单,但您可以使用多种方式选择所有select none,例如在checkboxes之外定义两个单独的listView ,或者togglebutton或其他你想要的东西,重要的是为你想要使用它的相应组件添加一个监听器来选择所有选择无,然后我认为一切都变得容易了。