JavaFXTableView。如何检查用户输入的uniqe值

JavaFXTableView。如何检查用户输入的uniqe值,java,javafx,tableview,Java,Javafx,Tableview,我有以下问题:我使用JavaFX编写我的应用程序。我使用TableView。用户应该使用它来观察、添加和删除数据。我的ID字段应该是唯一的。所以当用户完成编辑时,我必须检查结果是否唯一。如果它是独一无二的,我必须排除变化。或者更好的是,我必须在数据更新时检查它,如果必要,跳过更新 我有三列的TableView colID.setCellValueFactory((TableColumn.CellDataFeatures<CDataType, String> cell) -&g

我有以下问题:我使用JavaFX编写我的应用程序。我使用TableView。用户应该使用它来观察、添加和删除数据。我的ID字段应该是唯一的。所以当用户完成编辑时,我必须检查结果是否唯一。如果它是独一无二的,我必须排除变化。或者更好的是,我必须在数据更新时检查它,如果必要,跳过更新

我有三列的TableView

    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是一件让我在编码过程中沮丧了很多天的事情。它最终停止更改显示值,直到您重新绘制它,所以这是我发现的唯一提供一致行为的方法。