3 回答

TA貢獻1802條經驗 獲得超6個贊
基本問題是,沒有任何可編輯(也不是像 CheckBoxXX 這樣的偽可編輯)樹/表單元格尊重它們所在行的可編輯性。我認為這是一個錯誤。
要克服這一問題,您必須擴展(偽)可編輯單元格并使它們尊重行的可編輯性。偽編輯單元格和真實編輯單元格的確切實現是不同的。以下是內嵌示例,對于頻繁使用,您可以將它們設為頂級并重復使用。
CheckBoxTreeTableCell:子類化并覆蓋 updateItem 以重新綁定其禁用的屬性,例如
colSelected.setCellFactory(c -> {
TreeTableCell cell = new CheckBoxTreeTableCell() {
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (getGraphic() != null) {
getGraphic().disableProperty().bind(Bindings
.not(
getTreeTableView().editableProperty()
.and(getTableColumn().editableProperty())
.and(editableProperty())
.and(getTreeTableRow().editableProperty())
));
}
}
};
return cell;
});
對于真正的編輯單元格,fi TextFieldTreeTableCell: 覆蓋 startEdit 并返回,如果該行不可編輯,則不調用 super
colName.setCellFactory(c -> {
TreeTableCell cell = new TextFieldTreeTableCell() {
@Override
public void startEdit() {
if (getTreeTableRow() != null && !getTreeTableRow().isEditable()) return;
super.startEdit();
}
};
return cell;
});
現在你可以像你一樣切換行的可編輯性,稍微改變邏輯以保證在所有情況下完全清理:
ttv.setRowFactory(table-> {
return new TreeTableRow<Person>(){
@Override
public void updateItem(Person pers, boolean empty) {
super.updateItem(pers, empty);
// tbd: check for nulls!
boolean isTopLevel = table.getRoot().getChildren().contains(treeItemProperty().get());
if (!isEmpty() && isTopLevel) {
// if(isTopLevel){
setStyle("-fx-background-color:lightgrey;");
setEditable(false);
}else{
setEditable(true);
setStyle("-fx-background-color:white;");
}
}
};
});

TA貢獻2039條經驗 獲得超8個贊
如果您想禁用特定的 Cell,則在 CellFactory 而不是 RowFactory 中處理禁用邏輯。TreeTableColumn(..)的靜態方法是一種方便快速使用的方法。但這不是唯一的方法。您仍然可以為 CheckBoxTreeTableCell 創建自己的工廠。
所以代替
colSelected.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(colSelected));
設置 cellfactory 如下,這應該適合你。
colSelected.setCellFactory(new Callback<TreeTableColumn<Person, Boolean>, TreeTableCell<Person, Boolean>>() {
@Override
public TreeTableCell<Person, Boolean> call(TreeTableColumn<Person, Boolean> column) {
return new CheckBoxTreeTableCell<Person, Boolean>() {
@Override
public void updateItem(Boolean item, boolean empty) {
super.updateItem(item, empty);
boolean isTopLevel = column.getTreeTableView().getRoot().getChildren().contains(getTreeTableRow().getTreeItem());
setEditable(!isTopLevel);
}
};
}
});
添加回答
舉報