当我尝试在javafx中编辑一个列值时,TableView会更改所有行

时间:2016-07-05 09:39:30

标签: tableview javafx-8

我有一个TableView,其items属性绑定到类Group的{​​{1}}属性,该属性声明为:

applications

初始化为:

ObjectProperty<ObservableList<Application>> applications = new SimpleObjectProperty();

applications.set(new FXCollections.observableArrayList<Application>()); applications.get().add(new Application()); applications.get().add(new Application()); 类包含一些属性,另一个类Application已声明并初始化为:

Customer

现在tableView中有四列可编辑,它们是&#39; ApplicationNo&#39;,&#39; ApplicationDate&#39;,&#39; CustomerId&#39;和&#39;客户名称&#39;。前2列的单元格值工厂设置为ObjectProperty<Customer> customer = SimpleObjectProperty<>(new Customer()); ApplicationapplicationNo属性。并且最后2列的单元格值工厂设置为applicationDateApplication属性的customercustomerId属性。所有四列都可以使用组合框控件进行编辑,这些控件使用数据库中的值进行填充。

除了上面提到的表格视图外,我还在FXML中有一个表单,其中包含customerName类和Application类中的字段。如果未选择任何表行,并且在选择任何表视图行时使用Customer实例的值启用此表单,则会禁用此表单。

现在我的问题是,当我选择任何行并编辑表格或表格中的值时,所有行都会获得我输入的新值。

我没有上传代码,因为它非常冗长。

表格单元格编辑器Application方法的代码

updateItem

protected void updateItem(T item, boolean empty) { super.updateItem(item, empty); if (isEmpty()) { setText(null); setGraphic(null); } else { if (isEditing()) { if (control != null) { updateControl(); } setGraphic(control); setContentDisplay(ContentDisplay.GRAPHIC_ONLY); } else { setText(getItemText()); setGraphic(null); setContentDisplay(ContentDisplay.TEXT_ONLY); } }

的单元工厂和单元格值工厂的代码
applicationNo

1 个答案:

答案 0 :(得分:0)

实际上我已经找到了实际问题及其解决方案。为了改变我选择的行选择:

tableView.getSelectionModel().selectedItemProperty().addListener(.....);

实际上当我选择第一行后选择第二行作为包含的行和Application的相等实例导致row1.equals(row2),这反过来又不允许上面的侦听器触发。因此,值的解除绑定从未发生过,导致控件仍然绑定到两行。

作为解决方案,我将上述内容改为:

tableView.getSelectionModel().selectedIndexProperty().addListener(......);

这里每当我选择一个不同的行时就会触发,从而取消绑定控件和前一行的属性,并将控件绑定到新行的属性。这解决了我的问题。我会要求如果有任何其他建议请发表答案。