调用startEdit或setOnEditCommit都没有

时间:2015-03-13 12:11:24

标签: javafx tableview editing

我按照这个链接上提到的这个例子 -     UITableView - Better Editing through Binding?     我相应地改了一下

Model class - 

     public static class TableData {

        private String firstName, lastName;

        private TableData(String first, String last) {
            this.firstName = first;
            this.lastName = last;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

    }

自定义单元工厂 -

     public static class TextFieldCellFactory implements Callback<TableColumn<TableData, String>, TableCell<TableData, String>> {

    @Override
    public TableCell<TableData, String> call(TableColumn<TableData, String> param) {
        TextFieldCell textFieldCell = new TextFieldCell();
        return textFieldCell;
    }

    public static class TextFieldCell extends TableCell<TableData, String> {

        private TextField textField;
        private StringProperty boundToCurrently = null;
        private String newval = "";

        public TextFieldCell() {


            textField = new TextField();
            textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
                @Override
                public void handle(KeyEvent t) {
                    if (t.getCode() == KeyCode.ENTER) {
                        System.out.println("key pressed");
                        commitEdit(textField.getText());

                    } else if (t.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });

            textField.textProperty().addListener(new ChangeListener<String>() {

                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
             // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

                    // commitEdit(newValue);
                    System.out.println("" + newValue);
                    newval = newValue;
                }

            });

            textField.focusedProperty().addListener(new ChangeListener<Boolean>() {

                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {

                        if(!newValue){
                        System.out.println("losing focus" + newval);
                        //commichange();
                        commitEdit(textField.getText());
                        }

                    }
                });



            this.setGraphic(textField);
        }

        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (!empty) {
                // Show the Text Field
                this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                textField.setText(item);



            } else {
                this.setContentDisplay(ContentDisplay.TEXT_ONLY);
            }
        }

    }
}

设置onEditCommit -

c1.setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<TableData, String>>() {
                @Override
                public void handle(TableColumn.CellEditEvent<TableData, String> t) {
                    System.out.println("ON edit commit" + t);
                    ((TableData) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())).setFirstName(t.getNewValue());
                }
            }
    );
  1. 问题1-我想知道调用commitEdit()时会发生什么。它会调用setOnEditCommit吗?如果确实如此,那么为什么它不调用setOnEditCoommit
  2. 问题2 - 为什么不进入setOnEditCommit?
  3. 问题3我应用startEdit来检查它是否进入该字段。但是这个方法也没有被调用。
  4. 任何人都可以指出我在这里缺少的东西。我不想要一个解决方法。我需要了解其背后的原因 P.S我已经删除了链接中给出的绑定属性。

1 个答案:

答案 0 :(得分:0)

您的桌子永远不会进入编辑状态(因为您从未要求它)。由于单元格永远不会isEditing()返回true,因此默认的commitEdit()方法变为无操作。

您需要TableView知道当该单元格中的文本字段获得焦点时必须开始编辑单元格。您可以通过修改文本字段上的焦点侦听器来执行此操作:

                textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
                    @Override
                    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                        if (newValue) {
                            getTableView().edit(getIndex(), getTableColumn());
                        } else {
                            commitEdit(textField.getText());
                        }
                    }
                });