How to commit when clicking outside an editable TableView cell in JavaFX?

后端 未结 4 835
清歌不尽
清歌不尽 2020-12-29 10:25

I have a table cell factory responsible for creating an editable cell in a JavaFX TableView.

I\'m trying to implement some added functionality to the tableview so th

4条回答
  •  情歌与酒
    2020-12-29 11:11

    Here's how I did it - I binded the textField's text property with the text property of the cell (bidirectional).

    class EditingCell extends TableCell {
    
            private final TextField mTextField;
    
            public EditingCell() {
    
                super();
    
                mTextField = new TextField();
    
                mTextField.setOnKeyPressed(new EventHandler() {
    
                    @Override
                    public void handle(KeyEvent event) {
    
                        if( event.getCode().equals(KeyCode.ENTER) )
                            commitEdit((T)mTextField.getText());
                    }
                });
    
                mTextField.focusedProperty().addListener(new ChangeListener() {
    
                    @Override
                    public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) {
    
                        if( !newValue )
                            commitEdit((T)mTextField.getText());
                    }
    
                });
    
                mTextField.textProperty().bindBidirectional(textProperty());
            }
    
            @Override
            public void startEdit() {
    
                super.startEdit();
    
                setGraphic(mTextField);
            }
    
            @Override
            public void cancelEdit() {
    
                super.cancelEdit();
    
                setGraphic(null);
            }
    
            @Override
            public void updateItem(final T item, final boolean empty) {
    
                super.updateItem(item, empty);
    
                if( empty ) {
                    setText(null);
                    setGraphic(null);
                }
                else {
                    if( item == null ) {
                        setGraphic(null);
                    }
                    else {
                        if( isEditing() ) {
                            setGraphic(mTextField);
                            setText((String)getItem());
                        }
                        else {
                            setGraphic(null);
                            setText((String)getItem());
                        }
                    }
                }
            }
        }
    

提交回复
热议问题