繁体   English   中英

JavaFX,TableView,编辑后的动态更新项目

[英]JavaFX, TableView, dynamic update Item after edit

我正在尝试为TableView修改JavaFX示例代码,以在使用动态方法进行编辑后更新项目。 完整的教程和示例代码可以在这里找到:
https://docs.oracle.com/javafx/2/ui_controls/table-view.htm

Item的更新被编程为处理程序:

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()。
除了反思之外,还有其他可能性吗?

我想用以下方式获得Property的名称:

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

我可以使用propertyName设置firstName的值吗?
我知道,可以通过反射来完成,但是我想使用属性的功能。

谢谢安妮

你可以做

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的实用程序方法,给定标题和属性工厂。 我经常使用这样的便捷方法(略微适应您的用例):

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发行以来,它实际上应该被视为旧代码,它允许使用更多惯用的设置方法如上所述的单元格值工厂。

说我的对象是用场景构建器构建的。 但是它将功能代码定义在bean类中的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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM