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);
            }
        }
    }
}