TableView中的JavaFX微调器编辑器

TableView中的JavaFX微调器编辑器,java,javafx,tableview,spinner,Java,Javafx,Tableview,Spinner,我正在尝试在TableView中实现微调器编辑器。我在这个话题上看到了各种各样的StackOverflow,但似乎没有一个能解决这个问题 我创建了从TableCell扩展的类。微调器被创建了,我就是不能让微调器提交编辑 private final class SpinnerCell extends TableCell<Car, Integer> { private final ScrollSpinner<Integer> spinner; private

我正在尝试在TableView中实现微调器编辑器。我在这个话题上看到了各种各样的StackOverflow,但似乎没有一个能解决这个问题

我创建了从TableCell扩展的类。微调器被创建了,我就是不能让微调器提交编辑

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);
            }
        }
    }
}
私有最终类SpinnerCell扩展了TableCell{
私有最终滚动微调器微调器;
专用喷丝头单元(最小整数、最大整数、初始整数、步长整数){
微调器=新的滚动微调器();
spinner.setValueFactory(新整数PinnerValueFactory(最小值、最大值、初始值、步长));
可编辑设置(真);
}
@凌驾
公开作废已启动IT(){
如果(!isEmpty()){
super.startEdit();
spinner.getValueFactory().setValue(getItem());
setOnKeyTyped(事件->{//我尝试了spinner.setOnKeyTyped,spinner.getEditor().setOnKeyTyped,但没有成功
if(event.getCode()==KeyCode.ENTER){
Log.debug(“提交”);
CommittedIt(spinner.getValue());//FIXME从未提交
}
});
setText(空);
设置图形(旋转器);
}
}
@凌驾
公共作废取消编辑(){
super.cancelEdit();
setText(getItem().toString());
设置图形(空);
}
@凌驾
public void updateItem(整数项,布尔空){
super.updateItem(项,空);
if(空){
setText(空);
设置图形(空);
}否则{
if(isEditing()){
setText(空);
设置图形(旋转器);
}否则{
setText(getItem().toString());
设置图形(空);
}
}
}
}

}

您必须将
onKeyTyped
更改为
onKeyPressed
。您还必须将
committedit
调用包装到
平台中。稍后运行

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);
            }
        }
    }
}
私有最终类SpinnerCell扩展了TableCell{
私有最终滚动微调器微调器;
专用喷丝头单元(最小整数、最大整数、初始整数、步长整数){
微调器=新的滚动微调器();
spinner.setValueFactory(新整数PinnerValueFactory(最小值、最大值、初始值、步长));
可编辑设置(真);
}
@凌驾
公开作废已启动IT(){
如果(!isEmpty()){
super.startEdit();
spinner.getValueFactory().setValue(getItem());
按下设置键(事件->{
if(event.getCode()==KeyCode.ENTER){
Platform.runLater(()->{
committedit(spinner.getValue());
});
}
});
setText(空);
设置图形(旋转器);
}
}
@凌驾
公共作废取消编辑(){
super.cancelEdit();
setText(getItem().toString());
设置图形(空);
}
@凌驾
public void updateItem(整数项,布尔空){
super.updateItem(项,空);
if(空){
setText(空);
设置图形(空);
}否则{
if(isEditing()){
setText(空);
设置图形(旋转器);
}否则{
setText(getItem().toString());
设置图形(空);
}
}
}
}