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; } });
selectedProperty
inheritance自Cell
,它仅指示是否在UI组件中选择了Cell
。 由于您可能没有在TableView
上启用单元格选择,因此单元格永远不会被选中。 这不是你想要的东西; 你想知道CheckBox
是否被选中,而不是Cell
。
这里的技巧是使用CheckBoxTableCell
的selectedStateCallback
属性。 这是一个将单元格的索引映射到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 extends Boolean> obs, Boolean wasSelected, Boolean isSelected) { System.out.println(isSelected); } });
像往常一样,所有这些代码在Java 8中都看起来好多了。