我有一个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());
类Application
和applicationNo
属性。并且最后2列的单元格值工厂设置为applicationDate
类Application
属性的customer
和customerId
属性。所有四列都可以使用组合框控件进行编辑,这些控件使用数据库中的值进行填充。
除了上面提到的表格视图外,我还在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
答案 0 :(得分:0)
实际上我已经找到了实际问题及其解决方案。为了改变我选择的行选择:
tableView.getSelectionModel().selectedItemProperty().addListener(.....);
实际上当我选择第一行后选择第二行作为包含的行和Application
的相等实例导致row1.equals(row2)
,这反过来又不允许上面的侦听器触发。因此,值的解除绑定从未发生过,导致控件仍然绑定到两行。
作为解决方案,我将上述内容改为:
tableView.getSelectionModel().selectedIndexProperty().addListener(......);
这里每当我选择一个不同的行时就会触发,从而取消绑定控件和前一行的属性,并将控件绑定到新行的属性。这解决了我的问题。我会要求如果有任何其他建议请发表答案。