自制ChoiceBoxTableCell startEdit-方法没有将Cell.editing变成true
我的问题很简单。我重写了 TableCell 的一些方法,如下所示:
class ChoiceBoxTableCell<S, T> extends TableCell<S, T> {
private ChoiceBox<T> view;
private ObservableList<T> values;
@Override
public void cancelEdit() {
super.cancelEdit();
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
private void createView() {
view = new ChoiceBox<T>(values);
view.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
final EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
@Override
public void handle(final KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(view.getSelectionModel().getSelectedItem());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
};
view.setOnKeyPressed(keyHandler);
view.setOnKeyTyped(keyHandler);
view.setOnKeyReleased(keyHandler);
}
public ObservableList<T> getValues() {
return values;
}
public void setValues(final ObservableList<T> values) {
this.values = values;
}
@Override
public void startEdit() {
super.startEdit();
System.out.println("ChoiceBoxTableCell.startEdit() -> editable: " + isEditable()); // print is true
System.out.println("ChoiceBoxTableCell.startEdit() -> editing: " + isEditing()); // print is false
if (view == null) {
createView();
} else {
view.getSelectionModel().select(getItem());
}
setGraphic(view);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
@Override
public void updateItem(final T item, final boolean empty) {
super.updateItem(item, empty);
if (view != null) {
view.getSelectionModel().select(item);
}
if (item != null) {
setText(item.toString());
}
}
}
现在我希望在运行 super.startEdit() 后将变量“editing”设置为 true。在下面的类中,代码有效:
abstract class AbstractEditingTableCell<S, T> extends TableCell<S, T> {
private TextField textField;
public AbstractEditingTableCell() {}
@Override
public void cancelEdit() {
super.cancelEdit();
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
private void commit() {
try {
final String text = textField.getText();
commitEdit(parse(text));
} catch (final Exception e) {
// FIXME Ungültige Eingabe: TextField markieren als fehlerhaft
e.printStackTrace();
}
}
private void createTextField() {
textField = new TextField(getFormatted(getItem()));
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
final EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
@Override
public void handle(final KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commit();
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
};
textField.setOnKeyPressed(keyHandler);
textField.setOnKeyTyped(keyHandler);
textField.setOnKeyReleased(keyHandler);
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue, final Boolean newValue) {
if (!newValue) {
commit();
}
}
});
}
public abstract String getFormatted(T item);
protected abstract T parse(String value) throws Exception;
@Override
public void startEdit() {
super.startEdit();
System.out.println("AbstractEditingTableCell.startEdit() -> editing: " + isEditing()); // print is true
if (textField == null) {
createTextField();
} else {
textField.setText(getFormatted(getItem()));
}
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
@Override
public void updateItem(final T item, final boolean empty) {
super.updateItem(item, empty);
if (textField != null) {
textField.setText(getFormatted(item));
}
setText(getFormatted(item));
}
}
我看到的唯一区别是 ChoiceBox。 有人对我的问题有建议吗?
PS:请原谅我的英语,我不是本地人;)
谢谢你的时间
帕特里克
my problem is quiet simple. I overrode a few methods of TableCell as follows:
class ChoiceBoxTableCell<S, T> extends TableCell<S, T> {
private ChoiceBox<T> view;
private ObservableList<T> values;
@Override
public void cancelEdit() {
super.cancelEdit();
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
private void createView() {
view = new ChoiceBox<T>(values);
view.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
final EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
@Override
public void handle(final KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(view.getSelectionModel().getSelectedItem());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
};
view.setOnKeyPressed(keyHandler);
view.setOnKeyTyped(keyHandler);
view.setOnKeyReleased(keyHandler);
}
public ObservableList<T> getValues() {
return values;
}
public void setValues(final ObservableList<T> values) {
this.values = values;
}
@Override
public void startEdit() {
super.startEdit();
System.out.println("ChoiceBoxTableCell.startEdit() -> editable: " + isEditable()); // print is true
System.out.println("ChoiceBoxTableCell.startEdit() -> editing: " + isEditing()); // print is false
if (view == null) {
createView();
} else {
view.getSelectionModel().select(getItem());
}
setGraphic(view);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
@Override
public void updateItem(final T item, final boolean empty) {
super.updateItem(item, empty);
if (view != null) {
view.getSelectionModel().select(item);
}
if (item != null) {
setText(item.toString());
}
}
}
Now i would expect that the variable 'editing' would be set to true after running through super.startEdit(). In the following class the code works:
abstract class AbstractEditingTableCell<S, T> extends TableCell<S, T> {
private TextField textField;
public AbstractEditingTableCell() {}
@Override
public void cancelEdit() {
super.cancelEdit();
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
private void commit() {
try {
final String text = textField.getText();
commitEdit(parse(text));
} catch (final Exception e) {
// FIXME Ungültige Eingabe: TextField markieren als fehlerhaft
e.printStackTrace();
}
}
private void createTextField() {
textField = new TextField(getFormatted(getItem()));
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
final EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
@Override
public void handle(final KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commit();
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
};
textField.setOnKeyPressed(keyHandler);
textField.setOnKeyTyped(keyHandler);
textField.setOnKeyReleased(keyHandler);
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue, final Boolean newValue) {
if (!newValue) {
commit();
}
}
});
}
public abstract String getFormatted(T item);
protected abstract T parse(String value) throws Exception;
@Override
public void startEdit() {
super.startEdit();
System.out.println("AbstractEditingTableCell.startEdit() -> editing: " + isEditing()); // print is true
if (textField == null) {
createTextField();
} else {
textField.setText(getFormatted(getItem()));
}
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
@Override
public void updateItem(final T item, final boolean empty) {
super.updateItem(item, empty);
if (textField != null) {
textField.setText(getFormatted(item));
}
setText(getFormatted(item));
}
}
The only difference I see is the ChoiceBox.
Does anyone have a suggestion for my problem?
PS: please excuse my english i'm not a native ;)
thank you for your time
patrick
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论