2016-05-29 4 views
0

Я создал этот GUI в JavaFXTableView не показывая данные до фильтра

Java FX TableView http://image.prntscr.com/image/7b207d4f7b064d8fa8c827e295a8035e.png

Проблема не в том, что, когда я пытаюсь запустить функцию readList, после этого ничего будет показана в таблице, но, если я попытаюсь что-то фильтровать, появятся данные.

Что я сделал не так? Разве SortedList не связан с фильтром, связанным с ObservableCollection, который смотрит список лиц? Не следует автоматически обновлять TableView всякий раз, когда я что-то меняю в этом списке?

Это контроллер

public class LetturaAwpController { 

    List<Person> persons= new LinkedList<Person>(); 

    ObservableList<Person> observablePerson = FXCollections.observableList(persons); 

    @FXML 
    private TextField txtUser; 

    @FXML 
    private TextField txtPass; 

    @FXML 
    private TextField txtFiltraId; 

    @FXML 
    private CheckBox chkMag; 

    @FXML 
    private TableView<Person> tblMain; 

    @FXML 
    private TableColumn<Person, String> colId; 

    @FXML 
    void doRead(ActionEvent event) { 

     if(txtPass.getText().isEmpty() | txtUser.getText().length() < 6) 
      return; 
     if (persons== null) 
      persons= model.readList(txtUser.getText(), txtPass.getText()); 
     else 
      persons.addAll(model.readList(txtUser.getText(), txtPass.getText())); 
    } 

    @FXML 
    void initialize() { 

     FilteredList<Person> filteredPerson= new FilteredList<>(observablePerson , p-> true); 

     colId.setCellValueFactory(new PropertyValueFactory<Person,String>("idApparecchio"));  

     txtFiltraId.textProperty().addListener((observable, oldValue, newValue)-> { 
      filteredSlot.setPredicate(person-> { 
       if (newValue == null || newValue.isEmpty()){ 
        return true; 
       } 

       String lowerCaseFilter = newValue.toLowerCase(); 

       if(person.getIdApparecchio().toLowerCase().contains(lowerCaseFilter)){ 
        return true; 
       } else if (person.getNomeModello().toLowerCase().contains(lowerCaseFilter)){ 
        return true; 
       } 
       return false; 
      }); 
     }); 

     SortedList<Person> sortedData = new SortedList<>(filteredPerson); 

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

     // 5. Add sorted (and filtered) data to the table. 
     tblMain.setItems(sortedData); 

    } 

} 

ответ

1

Разве не SortedList связан с отфильтрованный, что связано с ObservableCollection

Да и да (Хотя нет ObservableCollection, это ObservableList)

, который смотрит список людей?

Нет

ObservableList не смотрит список, который передается FXCollections.observableList, он создает ObservableList, опирающуюся на List. Изменение списка поддержки не будет уведомлять слушателей, добавленных в ObservableList; ObservableList просто использует список поддержки для хранения его элементов. FilteredList полагается только на слушателя.

Это означает: не обращаться к списку резервных копий с доступом к записи. Измените ObservableList вместо:

observablePerson.addAll(model.readList(txtUser.getText(), txtPass.getText())); 

Кроме того if (persons== null) проверка не нужна, если вы инициализировать поле и никогда не изменять его. Также просто замена поля приведет к тому, что ObservableList будет поддерживаться списком, отличным от списка, сохраненного в поле ...

Смежные вопросы