2016-04-19 13 views
0

Ich verwende in meiner App this example, um den Benutzer eine Tabelle suchen/filtern lassen.Filterung funktioniert nicht nach einer Weile

Wenn Sie die Anwendung ausführen, funktioniert es perfekt.

Das Problem ist, wenn ich das Programm geöffnet, minimiert, und nach einer Weile (10-15min) versuche ich es wieder zu verwenden. Es ist dann, wenn die Suche/Filter überhaupt nicht funktioniert. Hier

ist der Code:

@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

Ich kann das überhaupt nicht reproduzieren. Es klingt ein wenig wie ein Problem, bei dem eine Bindung als Garbage Collected erfasst wird, aber ich kann es nicht reproduzieren, auch nicht indem ich den Garbage Collector mit 'System.gc()' erzwinge (was normalerweise eine zuverlässige Möglichkeit ist, diese Art von Fehlern zu reproduzieren) . Können Sie Ihrem Code Debugging hinzufügen, z. Fügen Sie eine Protokollierung oder einfach 'System.out.println (...)' hinzu, um zu sehen, ob der Listener im Textfeld aufgerufen wird und ob das Prädikat aufgerufen wird. –

Antwort

0

ich den Code ausprobiert und es funktioniert für mich.

Schritt 2 muss jedoch der letzte Schritt sein, da filteredData.setPredicate erst nach der zweiten Benutzereingabe wirksam wird.

Wenn jemand nur einen einzelnen Buchstaben hinzufügt, wird die Filterung nicht passieren.

Verwandte Themen