在处理需要居中复选框列的tableview时发现问题。我可以创建一个带复选框的列。我还想根据该复选框值在我的模型中设置属性。我用以下代码完成了它:
isCanceledCol.setCellValueFactory(new Callback<CellDataFeatures<TransactionModel,CheckBox>,ObservableValue<CheckBox>>() {
@Override
public ObservableValue<CheckBox> call(final CellDataFeatures<TransactionModel, CheckBox> p) {
CheckBox cb = new CheckBox();
cb.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
p.getValue().setIsCanceled(t1.booleanValue());
}
}
);
canceledCB.add(cb);
return new SimpleObjectProperty(cb);
}
上面代码的问题是,复选框显示为左对齐。我想让它居中,但我也想保留复选框的更改事件以更改我的模型属性(p.getValue()。setIsCanceled(t1.booleanValue());)。
我真的很感谢你们的帮助。
此致 Chrisma Andhika
答案 0 :(得分:3)
JavaFX Ensemble(javafx示例)具有您尝试使用的完美代码。此外,他们还提供了一种在CheckBox
中使用TableView
的更好方法。
重点是TableCell
控件使用的范围TableView
。要创建CheckBox
列,应创建并使用以下列:
//CheckBoxTableCell for creating a CheckBox in a table cell
public static class CheckBoxTableCell<S, T> extends TableCell<S, T> {
private final CheckBox checkBox;
private ObservableValue<T> ov;
public CheckBoxTableCell() {
this.checkBox = new CheckBox();
this.checkBox.setAlignment(Pos.CENTER);
setAlignment(Pos.CENTER);
setGraphic(checkBox);
}
@Override public void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
setGraphic(checkBox);
if (ov instanceof BooleanProperty) {
checkBox.selectedProperty().unbindBidirectional((BooleanProperty) ov);
}
ov = getTableColumn().getCellObservableValue(getIndex());
if (ov instanceof BooleanProperty) {
checkBox.selectedProperty().bindBidirectional((BooleanProperty) ov);
}
}
}
}
setAlignment(Pos.CENTER)
会将您的控件设置在单元格的中心。