【问题标题】:JavaFX, TableView, dynamic update Item after editJavaFX、TableView、编辑后动态更新Item
【发布时间】:2015-12-13 08:33:14
【问题描述】:

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

Item的更新被编程为handler:

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 的值?
我知道,它可以通过反射来完成,但我想使用属性的特性。

谢谢, 安妮

【问题讨论】:

    标签: java dynamic javafx properties tableview


    【解决方案1】:

    你可以的

    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 上定义的默认编辑提交处理程序基本相同。

    作为替代方案,您可以考虑定义一个实用方法来创建TableColumns,给定一个标题和一个属性工厂。我经常使用这样的便捷方法(稍微调整以包含您的用例):

    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 发布以来的遗留代码,它允许大量如上所述设置单元格值工厂的更惯用方法。

    【讨论】:

    • 非常感谢,这是一个很好的答案。你能告诉我如何避免警告“未经检查的演员”吗?警告:[unchecked] unchecked cast ((WritableValue)ov).setValue(t.getNewValue());必需:WritableValue 找到:ObservableValue
    • 我不这么认为:没有完全类型安全的方法来做到这一点:实际上在技术上可以有一个 ObservableValue&lt;String&gt;WritableValue&lt;SomethingElse&gt;,当然没有办法运行时检查类型参数的类型由于类型擦除。
    【解决方案2】:

    说我的对象是用场景构建器构建的。但是它将函数代码定义 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2012-10-05
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      相关资源
      最近更新 更多