【发布时间】:2015-08-28 06:39:39
【问题描述】:
我尝试从此处http://docs.oracle.com/javafx/2/ui_controls/table-view.htm 对焦点更改实施编辑提交。我有以下内容:
class EditingCell extends TableCell<Object, String> {
private TextField textField;
public EditingCell() {
}
@Override
public void startEdit() {
System.out.println("START EDIT");
if (!isEmpty()) {
super.startEdit();
createTextField();
setText(null);
setGraphic(textField);
textField.selectAll();
}
}
@Override
public void cancelEdit() {
System.out.println("CANCEL EDIT");
super.cancelEdit();
setText((String) getItem());
setGraphic(null);
}
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (textField != null) {
textField.setText(getString());
}
setText(null);
setGraphic(textField);
} else {
setText(getString());
setGraphic(null);
}
}
}
private void createTextField() {
textField = new TextField(getString());
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
textField.focusedProperty().addListener(new ChangeListener<Boolean>(){
@Override
public void changed(ObservableValue<? extends Boolean> arg0,
Boolean arg1, Boolean arg2) {
System.out.println("Test1");
if (!arg2) {
commitEdit(textField.getText());
}
}
});
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}
我有 POJO DTO,这就是我使用 propertybuilder 的原因。在这里我使用这个代码:
Callback<TableColumn, TableCell> cellFactory =
new Callback<TableColumn, TableCell>() {
public TableCell call(TableColumn p) {
return new EditingCell();
}
};
....
TableColumn textColumn = new TableColumn<>("Text");
textColumn.setEditable(true);
textColumn.setCellFactory(cellFactory);
textColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Answer,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Answer, String> item) {
try {
return new JavaBeanStringPropertyBuilder().bean(item.getValue()).name("text").build();
} catch (NoSuchMethodException ex) {
Logger.getLogger(TaskDirItemController.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
});
textColumn.setOnEditCommit(//THIS HANDLER IS NEVER CALLED
new EventHandler<CellEditEvent<Answer, String>>() {
@Override
public void handle(CellEditEvent<Answer, String> t) {
System.out.println("New Value:"+t.getNewValue());
Answer answer=(Answer)t.getTableView().getItems().get(t.getTablePosition().getRow());
}
}
);
我的错误是什么?
编辑 1
我发现只有当我们将焦点更改到同一个表中的行之外的任何其他 JavaFx 组件时,才会调用处理程序。如何解决?
【问题讨论】:
-
@Uluk Biy 你能看一下吗?
-
这是 JavaFX 8 中的一个错误。目前没有简单的解决方法。见stackoverflow.com/questions/29576577/…
-
@Uluk Biy 谢谢!正如我所说 - 大师!