JavaFXTableView。如何检查用户输入的uniqe值
我有以下问题:我使用JavaFX编写我的应用程序。我使用TableView。用户应该使用它来观察、添加和删除数据。我的ID字段应该是唯一的。所以当用户完成编辑时,我必须检查结果是否唯一。如果它是独一无二的,我必须排除变化。或者更好的是,我必须在数据更新时检查它,如果必要,跳过更新 我有三列的TableViewJavaFXTableView。如何检查用户输入的uniqe值,java,javafx,tableview,Java,Javafx,Tableview,我有以下问题:我使用JavaFX编写我的应用程序。我使用TableView。用户应该使用它来观察、添加和删除数据。我的ID字段应该是唯一的。所以当用户完成编辑时,我必须检查结果是否唯一。如果它是独一无二的,我必须排除变化。或者更好的是,我必须在数据更新时检查它,如果必要,跳过更新 我有三列的TableView colID.setCellValueFactory((TableColumn.CellDataFeatures<CDataType, String> cell) -&g
colID.setCellValueFactory((TableColumn.CellDataFeatures<CDataType, String> cell) -> cell.getValue().getSID());
colCaption.setCellValueFactory((TableColumn.CellDataFeatures<CDataType, String> cell) -> cell.getValue().getSCaption());
colType.setCellValueFactory((TableColumn.CellDataFeatures<CDataType, String> cell) -> cell.getValue().getSType());
colID.setCellFactory(TextFieldTableCell.forTableColumn());
colCaption.setCellFactory(TextFieldTableCell.forTableColumn());
colType.setCellFactory(TextFieldTableCell.forTableColumn());
lstObservable = FXCollections.observableList(lstData, (CDataType param)->{
param.getSID().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
System.out.println("getSID().ChangeListener: Changed: " + observable + ")"+ observable.getClass() + ") [" + oldValue + " -> " + newValue + "]");
}
});
return new Observable[]{param.getSID(),
param.getSCaption(),
param.getSType()
};
});
tabView.setItems(lstObservable);
colID.setCellValueFactory((TableColumn.CellDataFeatures单元格)->cell.getValue().getSID());
colCaption.setCellValueFactory((TableColumn.CellDataFeatures单元格)->cell.getValue().getSCaption());
colType.setCellValueFactory((TableColumn.CellDataFeatures单元格)->cell.getValue().getSType());
colID.setCellFactory(TextFieldTableCell.forTableColumn());
colCaption.setCellFactory(TextFieldTableCell.forTableColumn());
colType.setCellFactory(TextFieldTableCell.forTableColumn());
lstObservable=FXCollections.observableList(lstData,(CDATA类型参数)->{
param.getSID().addListener((observeValue您可以在编辑提交中处理此问题-类似于以下内容:
colID.setOnEditCommit(event -> {
String newValue = event.getNewValue();
if(checkUniqueness(newValue)){
event.getRowValue().setSID(newValue);
}else {
event.getRowValue().setSID(null);
}
//Weird FX Bug - on the second time through, the value was set, but the table
//column didn't repaint, showing the incorrect amount.
colID.setVisible(false);
colID.setVisible(true);
});
//Stream the backing collection for the table and look for the value that needs to be unique
public boolean checkUniqueness(String value) {
return backingCollection
.stream()
.noneMatch(item -> item.getSID().equals(value));
}
好的,最简单的方法是收集一个集合中的所有id,然后在插入新值时检查该集合是否包含该id。如果没有数百万条可以快速工作的记录,问题是我不知道应该在哪里检查它?如果在ChangeListener中,我如何避免更改?非常感谢!此技巧与setVisible rea我帮了忙。除了列可见性之外,我也做了同样的事情。再次感谢!setVisible是一件让我在编码过程中沮丧了很多天的事情。它最终停止更改显示值,直到您重新绘制它,所以这是我发现的唯一提供一致行为的方法。