TableView在过滤之前不显示数据

时间:2016-05-29 22:33:31

标签: java javafx tableview observablecollection

我在JavaFX中创建了这个GUI

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

问题在于,当我尝试运行readList函数时,之后表中没有显示任何内容,但是,如果我尝试使用某些内容进行过滤,则会显示数据。

我做错了什么? SortedList是否链接到Filtered,链接到正在观看人员列表的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 个答案:

答案 0 :(得分:1)

  

SortedList是否链接到与ObservableCollection链接的Filtered

是和是(虽然没有ObservableCollection,但 ObservableList

  

正在观看人员名单?

没有

ObservableList未查看传递给FXCollections.observableList的列表,它会创建由ObservableList支持的List。修改后备列表不会通知添加到ObservableList的侦听器; ObservableList只使用支持列表来存储它的元素。 FilteredList依赖于听众。

这意味着:不要使用写访问访问支持列表。改为修改ObservableList

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

此外,如果您初始化字段并且从不修改它,则不需要if (persons== null)检查。同样简单地替换该字段将导致ObservableList由与该字段中存储的列表不同的列表支持...