CheckBoxTableCell changelistener无法正常工作

时间:2014-08-08 19:13:12

标签: java javafx listener tableview tablecell

我正在尝试向CheckBoxTableCells添加一个更改侦听器,但它似乎不起作用。我以CheckBoxes为例说明他们会以同样的方式工作。但是当我改变它的值时没有输出。我如何正确地将一个正确添加到checkboxtablecell?

当前代码:

tc.setCellFactory(new Callback<TableColumn<Trainee, Boolean>, TableCell<Trainee, Boolean>>() {
                    @Override
                    public TableCell<Trainee, Boolean> call(TableColumn<Trainee, Boolean> p) {
                        final CheckBoxTableCell ctCell = new CheckBoxTableCell<>();
                        ctCell.selectedProperty().addListener(new ChangeListener<Boolean>() {
                            @Override
                            public void changed(ObservableValue ov, Boolean old_val, Boolean new_val) {
                                System.out.println(new_val);
                            }
                        });
                        return ctCell;
                    }
                });

1 个答案:

答案 0 :(得分:10)

selectedProperty继承自Cell,它只是指示是否在UI组件中选择了Cell。由于您可能未在TableView上启用单元格选择,因此单元格永远不会被选中。这不是你想要的;您想知道是否选择了CheckBox,而不是Cell

这里的诀窍是使用selectedStateCallback的{​​{1}}属性。这是一个将单元格的索引映射到CheckBoxTableCell的函数。 BooleanProperty双向绑定到复选框的选定状态。

如果您的专栏代表BooleanProperty课程中的实际属性(我只是将其称为Trainee进行演示),那么您可以执行以下操作:

selectedProperty

然后final CheckBoxTableCell<Trainee, Boolean> ctCell = new CheckBoxTableCell<>(); ctCell.setSelectedStateCallback(new Callback<Integer, ObservableValue<Boolean>>() { @Override public ObservableValue<Boolean> call(Integer index) { return table.getItems().get(index).selectedProperty(); } }); 类中的属性与双向绑定到复选框状态。如果您需要做的不仅仅是在选中/取消选中复选框时更新模型对象,您可以只观察该属性。

如果您在Trainee课程中没有属性,则可以创建Trainee并观察它:

BooleanProperty

像往常一样,所有这些代码在Java 8中都看起来好多了。