2016-04-15 14 views
0

Ich versuche Set-Edit-Zelle auf Programm ausführen. Tabelle editierbar, cellfactory und andere einstellen. Ich kann die Zelle bearbeiten, wenn Sie mit der Maus klicken. Aber der Aufruf edit() Methode von TableView erstellt kein Textfeld.Javafx Tabellenansicht bearbeiten Methode CallFactory nicht aufrufen

Was habe ich verpasst?

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);} 
    } 
} 
+0

Kann nicht reproduzieren. Durch Doppelklicken auf ein Element in der Bearbeitungsspalte wird das Textfeld angezeigt. – fabian

+0

Bestätigt. Bei Verwendung einer ähnlichen Konfiguration konnte beim Aufrufen von tableview.edit (Zeile, Spalte) das editierbare Textfeld nicht aufgerufen werden. –

Antwort

0

ja ich bekomme auch dieses Problem. Die Art, wie ich es gelöst habe, besteht darin, den Aufruf der Editiermethode in einen anderen fx-Thread einzufügen.

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