我正在尝试向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;
}
});
答案 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中都看起来好多了。