2

選択したレコードをjavafxのテーブルビューから削除しようとしています. 以下は、テーブルにデータを入力する方法です。

public void setMainApp(MainAppClass mainApp){
    this.mainApp = mainApp;

    FilteredList<FileModel> filteredData = new FilteredList<>(mainApp.getFileData(), p -> true);

    // 2. Set the filter Predicate whenever the filter changes.
    filterField.textProperty().addListener((observable, oldValue, newValue) -> {
        filteredData.setPredicate(files -> {
            // If filter text is empty, display all files.
            if (newValue == null || newValue.isEmpty()) {
                return true;
            }

            String lowerCaseFilter = newValue.toLowerCase();
            if (files.getFileSubject().toLowerCase().indexOf(lowerCaseFilter) != -1) {
                return true; // Filter matches Subject.
            }
                else if (files.getFileDate().toLowerCase().indexOf(lowerCaseFilter) != -1) {
                return true; // Filter matches last name.
            }
            return false; // Does not match.
        });
    });

    // 3. Wrap the FilteredList in a SortedList. 
    SortedList<FileModel> sortedData = new SortedList<>(filteredData);

    // 4. Bind the SortedList comparator to the TableView comparator.
    sortedData.comparatorProperty().bind(fileTable.comparatorProperty());

    // 5. Add sorted (and filtered) data to the table.

    fileTable.setItems(sortedData);
}

そして、それが私がレコードを削除する方法です:

@FXML
private void deleteFile() {
    int selectedIndex = fileTable.getSelectionModel().getSelectedIndex();
    if (selectedIndex >= 0) {
        fileTable.getItems().remove(selectedIndex);
    } else {
        // Nothing selected.
        Alert alert = new Alert(AlertType.WARNING);
        alert.initOwner(mainApp.getPrimaryStage());
        alert.setTitle("No Selection");
        alert.showAndWait();
    }
} 

しかし、それはjava.lang.UnsupportedOperationExceptionエラーを出します。サンプル プロジェクトで同じことを行いましたが、うまくいきました。では、どうすればこの問題を解決できますか?

4

2 に答える 2

3

SortedList と FilteredList は、 remove(index)をサポートしない AbstractList から remove メソッドを継承します。ソース リスト ( mainApp.getFileData() ) からオブジェクトを削除する必要があります。

sortedData.getSourceIndexFor(mainApp.getFileData(), selectedIndex);

したがって、コードを次のように変更する必要があります

@FXML
private void deleteFile() {
  int selectedIndex = fileTable.getSelectionModel().getSelectedIndex();
  if (selectedIndex >= 0) {
    int sourceIndex = sortedData.getSourceIndexFor(mainApp.getFileData(), selectedIndex);
    mainApp.getFileData().remove(sourceIndex);
  }
}

この例では、else の原因を取り除いて最小限に抑えています。

于 2015-07-04T23:50:37.757 に答える