我想创建一个返回TableCell的Cell工厂,其行为与TextFieldTableCell完全相同,但有以下区别:当它失去焦点时,它会提交更改。
我的代码非常简单:
public final class TextFieldCellFactory<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
@Override
public TableCell<S, T> call(TableColumn<S, T> p) {
class EditingCell extends TextFieldTableCell {
public EditingCell() {
super();
setConverter(new DefaultStringConverter());
focusedProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
System.out.println("changed!");
System.out.println("getText() = " + getText());
System.out.println("textProperty() = " + textProperty().get());
System.out.println("getItem = " + getItem());
}
});
}
@Override
public void startEdit() {
super.startEdit();
}
@Override
public void cancelEdit() {
super.cancelEdit();
}
}
return new EditingCell();
}
}
如您所见,我在focusedProperty中添加了一个更改侦听器。问题是没有调用更改方法(没有打印)。
我如何获得所需的行为?谢谢。
答案 0 :(得分:0)
基本上,您必须使用textField(不是单元格)focusedProperty注册监听器。由于textfield是super的私有字段,因此无法直接访问 - 在将其添加到单元格后,您必须查找一次。这是第一次开始编辑时的情况:
private TextField myTextField;
@Override
public void startEdit() {
super.startEdit();
if (isEditing() && myTextField == null) {
// most simple case, assuming that there is no graphic other than the field
// TBD: implement the general case: walk the tree and find the field
myTextField = (TextField) getGraphic();
myTextField.focusedProperty().addListener((e, old, nvalue) -> {
if (!nvalue) {
T edited = getConverter().fromString(myTextField.getText());
commitEdit(edited);
}
});
}
}
一些注意事项: