【问题标题】:javafx CheckListView with custom objects to show particular property带有自定义对象的 javafx CheckListView 以显示特定属性
【发布时间】:2017-05-04 12:18:36
【问题描述】:

我的应用程序中有controlsfx CheckListView。我正在显示我的自定义对象(例如:员工)。我已经创建了一个员工对象列表并将其包装在一个可观察的列表中。现在我将可观察列表设置为我的 CheckListView。

checkListView.setItems(employeesObservableList);

到这里一切正常。

由于我绑定了员工对象,因此在列表视图中,每个复选框值都是我的员工对象的 toString()。我不希望那里的 toString() 值,而是希望显示员工 (eno) 的一些其他属性。

我在这里没有看到 cellValueFactory 并且我不知道如何利用 cellFactory 来完成我的任务,因为 CheckListView 已经设置了自己的 cellFactory。

所以我的问题是我想要一个带有我选择的复选框值的 CheckListView。

提前致谢!

【问题讨论】:

    标签: javafx java-8 javafx-2 javafx-8 controlsfx


    【解决方案1】:

    CheckListView 使用的列表单元格是来自javafx.scene.control.cell 的标准CheckBoxListCell。所以你可以用类似的东西覆盖cellFactory

    checkListView.setCellFactory(listView -> new CheckBoxListCell(checkListView::getItemBooleanProperty) {
        @Override
        public void updateItem(Employee employee, boolean empty) {
            super.updateItem(employee, empty);
            setText(employee == null ? "" : employee.getEno());
        }
    });
    

    请注意,CheckBoxListCell<T> 有一个构造函数,它采用 Callback<T, BooleanProperty> 指定显示项目的复选框的布尔属性; CheckListView 定义了一个方法getItemBooleanProperty(T item) 正好返回这个值,所以这里可以使用方法引用直接将它传递给构造函数。

    这是一个 SSCCE:

    import org.controlsfx.control.CheckListView;
    
    import javafx.application.Application;
    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ListChangeListener;
    import javafx.collections.ObservableList;
    import javafx.scene.Scene;
    import javafx.scene.control.cell.CheckBoxListCell;
    import javafx.stage.Stage;
    
    public class CheckListViewTest extends Application {
    
    
        @Override
        public void start(Stage primaryStage) {
            primaryStage.setTitle("Test");
    
            CheckListView<Employee> checkListView = new CheckListView<Employee>();
    
            ObservableList<Employee> oblist = FXCollections.observableArrayList();
            for (int i = 1; i <= 40; i++) {
                oblist.add(new Employee("Employee " + i, i));
            }
            checkListView.setItems(oblist);
    
            checkListView.setCellFactory(lv -> new CheckBoxListCell<Employee>(checkListView::getItemBooleanProperty) {
                @Override
                public void updateItem(Employee employee, boolean empty) {
                    super.updateItem(employee, empty);
                    setText(employee == null ? "" : String.format("Employee number: %04d", employee.getEno()));
                }
            });
    
            checkListView.getCheckModel().getCheckedIndices().addListener(new ListChangeListener<Integer>() {
                @Override
                public void onChanged(javafx.collections.ListChangeListener.Change<? extends Integer> c) {
                    while (c.next()) {
                        if (c.wasAdded()) {
                            for (int i : c.getAddedSubList()) {
                                System.out.println(checkListView.getItems().get(i).getName() + " selected");
                            }
                        }
                        if (c.wasRemoved()) {
                            for (int i : c.getRemoved()) {
                                System.out.println(checkListView.getItems().get(i).getName() + " deselected");
                            }
                        }
                    }
                }
            });
    
    
            Scene scene = new Scene(checkListView);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static class Employee {
            private final StringProperty name = new SimpleStringProperty();
            private final IntegerProperty eno = new SimpleIntegerProperty();
            public Employee(String name, int eno) {
                setName(name) ;
                setEno(eno);
            }
            public final StringProperty nameProperty() {
                return this.name;
            }
    
            public final String getName() {
                return this.nameProperty().get();
            }
    
            public final void setName(final String name) {
                this.nameProperty().set(name);
            }
    
            public final IntegerProperty enoProperty() {
                return this.eno;
            }
    
            public final int getEno() {
                return this.enoProperty().get();
            }
    
            public final void setEno(final int eno) {
                this.enoProperty().set(eno);
            }
    
    
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    结果

    【讨论】:

    • 太棒了!非常感谢。
    猜你喜欢
    • 2017-11-19
    • 2018-08-02
    • 2016-04-22
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多