TableView 中的 JavaFX Spinner 编辑器
JavaFX Spinner Editor in TableView
我正在尝试在 TableView 中实现微调器编辑器。我看到了关于这个主题的各种 Whosebug,但其中 none 似乎解决了这个问题。
我创建了从 TableCell 扩展而来的 class。微调器已创建,但我无法让微调器提交编辑。
private final class SpinnerCell extends TableCell<Car, Integer> {
private final ScrollSpinner<Integer> spinner;
private SpinnerCell(int min, int max, int initial, int step) {
spinner = new ScrollSpinner<>();
spinner.setValueFactory(new IntegerSpinnerValueFactory(min, max, initial, step));
setEditable(true);
}
@Override
public void startEdit() {
if (!isEmpty()) {
super.startEdit();
spinner.getValueFactory().setValue(getItem());
setOnKeyTyped(event -> { //I tried spinner.setOnKeyTyped, spinner.getEditor().setOnKeyTyped with no luck
if (event.getCode() == KeyCode.ENTER) {
Log.debug("commiting");
commitEdit(spinner.getValue()); //FIXME Never commited
}
});
setText(null);
setGraphic(spinner);
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText(getItem().toString());
setGraphic(null);
}
@Override
public void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
setText(null);
setGraphic(spinner);
} else {
setText(getItem().toString());
setGraphic(null);
}
}
}
}
}
您必须将 onKeyTyped
更改为 onKeyPressed
。您还必须将 commitEdit
调用包装在 Platform.runLater
.
中
private final class SpinnerCell extends TableCell<Car, Integer> {
private final ScrollSpinner<Integer> spinner;
private SpinnerCell(int min, int max, int initial, int step) {
spinner = new ScrollSpinner<>();
spinner.setValueFactory(new IntegerSpinnerValueFactory(min, max, initial, step));
setEditable(true);
}
@Override
public void startEdit() {
if (!isEmpty()) {
super.startEdit();
spinner.getValueFactory().setValue(getItem());
setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.ENTER) {
Platform.runLater(() -> {
commitEdit(spinner.getValue());
});
}
});
setText(null);
setGraphic(spinner);
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText(getItem().toString());
setGraphic(null);
}
@Override
public void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
setText(null);
setGraphic(spinner);
} else {
setText(getItem().toString());
setGraphic(null);
}
}
}
}
我正在尝试在 TableView 中实现微调器编辑器。我看到了关于这个主题的各种 Whosebug,但其中 none 似乎解决了这个问题。
我创建了从 TableCell 扩展而来的 class。微调器已创建,但我无法让微调器提交编辑。
private final class SpinnerCell extends TableCell<Car, Integer> {
private final ScrollSpinner<Integer> spinner;
private SpinnerCell(int min, int max, int initial, int step) {
spinner = new ScrollSpinner<>();
spinner.setValueFactory(new IntegerSpinnerValueFactory(min, max, initial, step));
setEditable(true);
}
@Override
public void startEdit() {
if (!isEmpty()) {
super.startEdit();
spinner.getValueFactory().setValue(getItem());
setOnKeyTyped(event -> { //I tried spinner.setOnKeyTyped, spinner.getEditor().setOnKeyTyped with no luck
if (event.getCode() == KeyCode.ENTER) {
Log.debug("commiting");
commitEdit(spinner.getValue()); //FIXME Never commited
}
});
setText(null);
setGraphic(spinner);
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText(getItem().toString());
setGraphic(null);
}
@Override
public void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
setText(null);
setGraphic(spinner);
} else {
setText(getItem().toString());
setGraphic(null);
}
}
}
}
}
您必须将 onKeyTyped
更改为 onKeyPressed
。您还必须将 commitEdit
调用包装在 Platform.runLater
.
private final class SpinnerCell extends TableCell<Car, Integer> {
private final ScrollSpinner<Integer> spinner;
private SpinnerCell(int min, int max, int initial, int step) {
spinner = new ScrollSpinner<>();
spinner.setValueFactory(new IntegerSpinnerValueFactory(min, max, initial, step));
setEditable(true);
}
@Override
public void startEdit() {
if (!isEmpty()) {
super.startEdit();
spinner.getValueFactory().setValue(getItem());
setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.ENTER) {
Platform.runLater(() -> {
commitEdit(spinner.getValue());
});
}
});
setText(null);
setGraphic(spinner);
}
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText(getItem().toString());
setGraphic(null);
}
@Override
public void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
setText(null);
setGraphic(spinner);
} else {
setText(getItem().toString());
setGraphic(null);
}
}
}
}