CheckBoxTableCell changelistener无法正常工作

我正在尝试向CheckBoxTableCells添加一个更改侦听器,但它似乎没有工作。 我以CheckBoxes为例,确定它们的工作方式是否相同。 但是,当我更改其值时,没有输出。 我如何正确地将一个正确添加到checkboxtablecell?

当前代码:

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

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

这里的技巧是使用CheckBoxTableCellselectedStateCallback属性。 这是一个将单元格的索引映射到BooleanProperty 。 该BooleanProperty双向绑定到复选框的选定状态。

如果你的列代表了你的Trainee类中的实际属性(我只是将它称为selectedProperty用于演示),那么你可以这样做:

 final CheckBoxTableCell ctCell = new CheckBoxTableCell<>(); ctCell.setSelectedStateCallback(new Callback>() { @Override public ObservableValue call(Integer index) { return table.getItems().get(index).selectedProperty(); } }); 

然后,在Trainee类中的属性与双向绑定到复选框状态。 如果您需要做的不仅仅是在选中/取消选中复选框时更新模型对象,您可以只观察该属性。

如果您在Trainee类中没有属性,则可以创建一个BooleanProperty并观察它:

 final CheckBoxTableCell ctCell = new CheckBoxTableCell<>(); final BooleanProperty selected = new SimpleBooleanProperty(); ctCell.setSelectedStateCallback(new Callback>() { @Override public ObservableValue call(Integer index) { return selected ; } }); selected.addListener(new ChangeListener() { @Override public void changed(ObservableValue obs, Boolean wasSelected, Boolean isSelected) { System.out.println(isSelected); } }); 

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