0

I have created a table view with with one Editable text feild.When i enter some text in the feild and press ENTER key, the value gets reflected on the table, i mean the value gets commited(setOnEditCommit gets invoked). But after entering the text and i just move the focus from the feild the value is not reflected on the table(setOnEditCommit is not invoked).

Please find the code below.

public class TabViewController {


    @FXML
    private TabPane cnfmTab;

    @FXML
    private TableView<TabVO> partsTable;

    @FXML
    private TableColumn<TabVO, String> column1;

    @FXML
    private TableColumn<TabVO, String> column2;

    @FXML
    private TableColumn<TabVO, String> column3;

    private ObservableList<TabVO> tableData = FXCollections.observableArrayList();

    private ObservableList<String> column1List;

    @FXML
    public void initialize(){

    tableData = FXCollections.observableArrayList(callDAO.getTableData(1));

    Callback<TableColumn<TabVo, String>, TableCell<TabVo, String>> cellFactory =
                new Callback<TableColumn<TabVo, String>, TableCell<TabVo, String>>() {
            public TableCell<TabVo, String> call(TableColumn<TabVo, String> p) {
                return new TextEditCell();
            }
        };
        column3.setCellFactory(cellFactory);

        column3.setOnEditCommit(
                new EventHandler<CellEditEvent<TabVo, String>>() {
                    @Override
                    public void handle(CellEditEvent<TabVo, String> t) {
                        System.out.println("Inside Column3 handler");
                        ((TabVo) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                                ).setColumn3(t.getNewValue());
                    }
                });

        column3.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getCpmComment()));
    partsTable.setItems(tableData);
}

Custom Text Cell.

public class TextEditCell extends TableCell<TabVo, String>{

    /** The text field. */
    private TextField textField;

    /**
     * Instantiates a new text edit cell.
     */
    public TextEditCell() {
    }

    /* (non-Javadoc)
     * @see javafx.scene.control.TableCell#startEdit()
     */
    @Override
    public void startEdit() {
        super.startEdit();
        if (!isEmpty()) {
            if(textField == null){
                createTextField();
            }
            setText(null);
            setGraphic(textField);
            textField.requestFocus();
            textField.selectAll();
        }
    }

    /* (non-Javadoc)
     * @see javafx.scene.control.TableCell#cancelEdit()
     */
    @Override
    public void cancelEdit() {
        super.cancelEdit();

        setText((String) getItem());
        setGraphic(null);
    }

    /* (non-Javadoc)
     * @see javafx.scene.control.Cell#updateItem(java.lang.Object, boolean)
     */
    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            if (isEditing()) {
                if (textField != null) {
                    textField.setText(getString());
                }
                setText(null);
                setGraphic(textField);
            } else {
                setText(getString());
                setGraphic(null);
            }
        }


    }

    /**
     * Creates the text field.
     */
    private void createTextField() {
        textField = new TextField(getItem());
        textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);

        textField.setOnKeyPressed(new EventHandler<KeyEvent>() {

            @Override
            public void handle(KeyEvent event) {
                if(event.getCode() == KeyCode.ENTER){
                    commitEdit(textField.getText());
                }
            }

        });

        textField.focusedProperty().addListener(new ChangeListener<Boolean>(){
            @Override
            public void changed(ObservableValue<? extends Boolean> arg0, 
                Boolean arg1, Boolean arg2) {
                    if (!arg2.booleanValue() && textField != null) {
                        System.out.println("Inside focus property " + textField.getText());

                            commitEdit(textField.getText());

                    }
            }
        });

    }


    /**
     * Gets the string.
     *
     * @return the string
     */
    private String getString() {
        return getItem() == null ? "" : getItem().toString();
    }

}

textField.setOnKeyPressed handler is working as expected, but textField.focusedProperty() listener is not working.

Can anyone please tell, if anything is wrong with my code. Thanks

Syed Ammar
  • 93
  • 2
  • 6
  • This sounds familiar: [see here](http://stackoverflow.com/questions/24694616/how-to-enable-commit-on-focuslost-for-tableview-treetableview). Moreover this has already been [reported](https://javafx-jira.kenai.com/browse/RT-18492), you may want to vote for it. – crusam Apr 07 '15 at 16:07
  • What is your version of OS and JavaFX? – Uluk Biy Apr 08 '15 at 06:05
  • @UlukBiy I am using Windows 7 with JavaFx 8 – Syed Ammar Apr 08 '15 at 12:44

0 Answers0