2015-09-16 85 views
0

我試圖修改TableView 的JavaFX示例代碼,以使用動態方法編輯後更新項目。 整個教程和示例代碼可以在這裏找到:
https://docs.oracle.com/javafx/2/ui_controls/table-view.htmJavaFX,TableView,動態更新編輯後的項目

項目的更新程序性的處理程序:

firstNameCol.setOnEditCommit(
new EventHandler<CellEditEvent<Person, String>>() { 
    @Override 
    public void handle(CellEditEvent<Person, String> t) { 
     ((Person) t.getTableView().getItems().get(
      t.getTablePosition().getRow()) 
      ).setFirstName(t.getNewValue()); 
    } 
}); 

我想用動態的東西,而不是setFirstName()。
除了反思之外還有其他可能嗎?

我manged以獲得屬性的名稱:

String propertyName = ((PropertyValueFactory)t.getTableColumn().getCellValueFactory()).getProperty(); 

我可以設置使用propertyName的莫名其妙中的firstName的價值?
我知道,它可以用反射來完成,但我想使用屬性的特徵。

謝謝 安妮

回答

3

你可以做

TableColumn<Person, String> col = t.getTableColumn(); 
int row = t.getTablePosition().getRow(); 
ObservableValue<String> ov = col.getCellObservableValue(row); 
if (ov instanceof WritableValue) { 
    ((WritableValue<String>)ov).setValue(t.getNewValue()); 
} 

,你應該能夠更換特定類型PersonString類型變量如果需要。

請注意,這與在TableColumn上定義的默認編輯提交處理程序基本相同。

作爲替代方案,您可以考慮定義一個實用程序方法,該方法創建TableColumn s,給定標題和屬性工廠。我經常用方便的方法是這樣的(略適用於包括你的使用情況):

private static <S,T> TableColumn<S,T> createColumn(String title, Function<S, Property<T>> property) { 
    TableColumn<S,T> col = new TableColumn<>(title); 
    col.setCellValueFactory(cellData -> property.apply(cellData.getValue())); 
    col.setOnEditCommit(edit -> { 
     S rowValue = edit.getRowValue(); 
     property.apply(rowValue).setValue(edit.getNewValue()); 
    }); 
    return col ; 
} 

然後,你可以做這樣的事情

TableView<Person> table = new TableView<>(); 
TableColumn<Person, String> firstNameColumn = createColumn("First Name", Person::firstNameProperty); 

和表列將已經設定的onEditCommit

我更喜歡這種一般風格的PropertyValueFactory,它不是類型安全的,並且由於名稱中的拼寫錯誤而容易出錯。從Java 8發佈以來,它確實應該被視爲遺留代碼,它允許更多如上所述設置單元價值工廠的慣用方法。

+0

非常感謝,這是很好的答案。你能告訴我如何避免警告「未經檢查的演員」? 警告:[unchecked]未勾選cast ((WritableValue )ov).setValue(t。的getNewValue()); 需要:一個WritableValue 發現:ObservableValue

+0

我不這麼認爲:有沒有做到這一點完全的類型安全方式:它實際上是在技術上可能有一個'ObservableValue '這是一個'一個WritableValue '當然,在運行時沒有辦法檢查由於類型擦除導致的類型參數的類型。 –

-1

說,我的對象與場景生成器生成。但它將函數代碼定義beans類中的fields屬性,這爲使用它們提供了可能性。

//@FXML 
@FXML 
Label nom; 
@FXML 
Label prenom; 
@FXML 
private TableColumn<UtilisateurToDisplay, String> firstNameColumn; 
@FXML 
private TableColumn<UtilisateurToDisplay, String> lastNameColumn; 
@FXML 
private TableView<UtilisateurToDisplay> UserTable; 
private final ObservableList<UtilisateurToDisplay> data_usr = FXCollections.observableArrayList(); 

public void initialize(URL location, ResourceBundle resources) { 
// Initialize table with the two columns. 
    firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty()); 
    lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty()); 


    // Listen for selection changes and show the person details when changed. 
    UserTable.getSelectionModel().selectedItemProperty().addListener(
      (observable, oldValue, newValue) -> showUserDetails(newValue)); 
} 
private void showUserDetails(UtilisateurToDisplay person) { 
    if (person != null) { 
     // Fill the labels with info from the person object. 
     nom.setText(person.getNom_usr()); 
     prenom.setText(person.getPrenom_usr()); 

    } else { 
     // Person is null, remove all the text. 
     nom.setText(""); 
     prenom.setText(""); 

    } 
} 
} 

你可以看到更詳細的這個地址: http://code.makery.ch/library/javafx-8-tutorial/part3/