0
私のアプリケーションでthis exampleを使用して、ユーザーが検索/フィルタリングできるようにしました。フィルタリングがしばらくしても機能しない
アプリケーションを実行すると、完璧に動作します。
問題は、私がプログラムを開いたままにしておき、しばらくしてから(10-15分後)もう一度使ってみることです。検索/フィルタがまったく機能しないときです。ここで
はコードです:
@FXML
private void initialize() {
// 0. Initialize the columns.
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty());
// 1. Wrap the ObservableList in a FilteredList (initially display all data).
FilteredList<Person> filteredData = new FilteredList<>(masterData, p -> true);
// 2. Set the filter Predicate whenever the filter changes.
filterField.textProperty().addListener((observable, oldValue, newValue) -> {
filteredData.setPredicate(person -> {
// If filter text is empty, display all persons.
if (newValue == null || newValue.isEmpty()) {
return true;
}
// Compare first name and last name of every person with filter text.
String lowerCaseFilter = newValue.toLowerCase();
if (person.getFirstName().toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches first name.
} else if (person.getLastName().toLowerCase().contains(lowerCaseFilter)) {
return true; // Filter matches last name.
}
return false; // Does not match.
});
});
// 3. Wrap the FilteredList in a SortedList.
SortedList<Person> sortedData = new SortedList<>(filteredData);
// 4. Bind the SortedList comparator to the TableView comparator.
sortedData.comparatorProperty().bind(personTable.comparatorProperty());
// 5. Add sorted (and filtered) data to the table.
personTable.setItems(sortedData);
}
}
私はそれをまったく再現できません。これは、バインディングがガベージコレクションされている問題のように思えますが、ガベージコレクタに 'System.gc()'を強制しても再現できません(これは通常、その種のバグを再現する信頼できる方法です) 。コードにデバッグを追加できますか?いくつかのロギングを追加するか、 'System.out.println(...)'だけを追加して、テキストフィールドのリスナーが呼び出されているか、述語が呼び出されているかどうかを確認します。 –