2016-04-19 13 views
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); 
     }     
    } 
+1

私はそれをまったく再現できません。これは、バインディングがガベージコレクションされている問題のように思えますが、ガベージコレクタに 'System.gc()'を強制しても再現できません(これは通常、その種のバグを再現する信頼できる方法です) 。コードにデバッグを追加できますか?いくつかのロギングを追加するか、 'System.out.println(...)'だけを追加して、テキストフィールドのリスナーが呼び出されているか、述語が呼び出されているかどうかを確認します。 –

答えて

0

私はコードを試してみました、それは私のために動作します。 filteredData.setPredicateは、2回目のユーザー入力後にのみ有効になるため、手順2は最後の手順である必要があります。filteredData.setPredicate

誰かがただ1つの文字を追加するだけであれば、フィルタリングは行われません。

関連する問題