Tae*_*rus 3 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;
}
});
Run Code Online (Sandbox Code Playgroud)
Jam*_*s_D 12
的selectedProperty是从继承Cell,它只是指示是否Cell在UI部件中选择.由于您可能没有启用单元格选择TableView,因此单元格永远不会被选中.这不是你想要的; 你想知道是否CheckBox被选中,而不是Cell.
这里的诀窍是使用的selectedStateCallback属性CheckBoxTableCell.这是一个将单元格的索引映射到a的函数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();
}
});
Run Code Online (Sandbox Code Playgroud)
然后,Trainee类中的属性与双向绑定到复选框状态.如果您需要做的不仅仅是在选中/取消选中复选框时更新模型对象,您可以只观察该属性.
如果您在Trainee课程中没有属性,则可以创建BooleanProperty并观察它:
final CheckBoxTableCell<Trainee, Boolean> ctCell = new CheckBoxTableCell<>();
final BooleanProperty selected = new SimpleBooleanProperty();
ctCell.setSelectedStateCallback(new Callback<Integer, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(Integer index) {
return selected ;
}
});
selected.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> obs, Boolean wasSelected, Boolean isSelected) {
System.out.println(isSelected);
}
});
Run Code Online (Sandbox Code Playgroud)
像往常一样,所有这些代码在Java 8中都看起来好多了.