Javafx tableview 编辑方法不调用 cellfactory

Javafx tableview edit method not call cellfactory

我尝试在 运行 程序中设置编辑单元格。设置table editable、cellfactory等。 用鼠标单击时,我可以编辑单元格。但是TableView的调用edit()方法并没有创建Textfield。

我错过了什么?

public class Main extends Application {

    TableView <TestClass> tableView;
    TableColumn <TestClass, String>  stringColumn;
    TableColumn <TestClass, String> editColumn;
    ObservableList<TestClass> items;

    @Override
    public void start(Stage primaryStage) throws Exception{
        makeTestData();

        tableView = new TableView();
        tableView.setEditable(true);
        stringColumn = new TableColumn<>("Col1");
        editColumn = new TableColumn<>("Col2");
        tableView.getColumns().addAll(stringColumn, editColumn);
        stringColumn.setCellValueFactory(cell -> cell.getValue().stringProperty());
        editColumn.setCellValueFactory(cell -> cell.getValue().editProperty());
        editColumn.setCellFactory(TextFieldTableCell.<TestClass>forTableColumn());
        tableView.setItems(items);

        tableView.getSelectionModel().select(1);
        tableView.getSelectionModel().focus(1);
        tableView.edit(1, editColumn);  // !!! not create textfield ???

        BorderPane pane = new BorderPane();
        pane.setCenter(tableView);
        primaryStage.setScene(new Scene(pane));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

    public void makeTestData(){
        items = FXCollections.observableArrayList(
                new TestClass("str1", "edit1"),
                new TestClass("str2", "edit2"),
                new TestClass("str3", "edit3")
        );
    }

    public class TestClass{
        StringProperty string = new SimpleStringProperty();
        StringProperty edit = new SimpleStringProperty();

        public TestClass() {}
        public TestClass(String string, String edit) {
            this.string = new SimpleStringProperty(string);
            this.edit = new SimpleStringProperty(edit);
        }
        public String getString() { return string.get();}
        public StringProperty stringProperty() { return string; }
        public void setString(String string) { this.string.set(string);}
        public String getEdit() { return edit.get();}
        public StringProperty editProperty() { return edit;}
        public void setEdit(String edit) { this.edit.set(edit);}
    }
}

是的,我也遇到了这个问题。我解决它的方法是将编辑方法调用放在另一个 fx 线程中。

Platform.runLater(() -> {
    tableView.edit(row, editColumn);
});