如何通过绑定到组合框将项目插入到tableview中?

时间:2018-01-25 18:36:48

标签: javafx combobox tableview

从组合框项目中选择时,tableview刷新确定。

ObservableList<Specie> species = FXCollections.observableArrayList();

//the tableview items depends on genderComboBox selected item
livingBeingTableView.itemsProperty().bind(Bindings.createObjectBinding(() -> {
            Gender gender = genderComboBox.getValue();
            if (gender == null) {
                return FXCollections.observableArrayList();
            } else {
                int id = gender.getId();
                //seachSpeciesIdGender(int id) find the species with the id associated
                species = SpecieDAO.searchSpeciesIdGender(id);
                return species;
            }
        }, genderComboBox.valueProperty()));
问题是。插入新项目并将其添加到tableview

    private void handleNewSpecie() {
            Specie tempSpecie = new Specie();
            boolean okClicked = main.showSpecieEditDialog(tempSpecie);
            if (okClicked) {
                SpecieDAO.insertSpecie(tempSpecie.getCommonName(), tempSpecie.getScientName(),
                        genderComboBox.getValue().getId(), 0, 0,
                        0, 0, 0);
                int id = genderComboBox.getValue().getId();
                species = SpecieDAO.searchSpeciesIdGender(id)
                livingBeingTableView.setItems(species);
            }
        }

无法设置绑定值

Caused by: java.lang.RuntimeException: TableView.items : A bound value cannot be set.
    at javafx.base/javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:143)
    at javafx.controls/javafx.scene.control.TableView.setItems(TableView.java:862)
    at cu.edu.cujae.guatini.controller.MainController.handleNewSpecie(MainController.java:213)
    ... 62 more

是否可以将带有bind tableview的项目插入到组合框中?我究竟做错了什么?谢谢,抱歉我的英文

1 个答案:

答案 0 :(得分:0)

您无法修改绑定的属性的值而不解除绑定。 (绑定意味着保持绑定属性的值与其他属性的值相同。)
您可能只需要向value属性添加一个侦听器并刷新此侦听器的列表:

private void refreshTable() {
    Gender gender = genderComboBox.getValue();
    ObservableList<Specie> species = (gender == null) ? FXCollections.emptyObservableList() : SpecieDAO.searchSpeciesIdGender(gender.getId());
    livingBeingTableView.setItems(species);
}
genderComboBox.valueProperty().addListener((o, a, newValue) -> refreshTable());
private void handleNewSpecie() {
    Specie tempSpecie = new Specie();
    boolean okClicked = main.showSpecieEditDialog(tempSpecie);
    if (okClicked) {
        SpecieDAO.insertSpecie(tempSpecie.getCommonName(), tempSpecie.getScientName(),
                genderComboBox.getValue().getId(), 0, 0,
                0, 0, 0);
        refreshTable();
    }
}

根据数据的大小,可以选择将两性保持在记忆中并使用FilteredList来显示适当的性别。这样您就可以简单地修改编辑中FilteredList的支持列表并绑定它的predicate属性:

ObservableList<Specie> species = FXCollections.observableArrayList(getAllSpecies());

// create filtered view of all species
FilteredList<Specie> filteredSpecies = new FilteredList<>(species);
filteredSpecies.predicateProperty().bind(Bindings.createObjectBinding(() -> {
    Gender gender = genderComboBox.getValue();
    if (gender == null) {
        return o -> false;
    } else {
        int id = gender.getId();
        return o -> o.getGenderId() == id;
    }
}, genderComboBox.valueProperty()));

livingBeingTableView.setItems(filteredSpecies);
if (okClicked) {
    SpecieDAO.insertSpecie(tempSpecie.getCommonName(), tempSpecie.getScientName(),
            genderComboBox.getValue().getId(), 0, 0,
            0, 0, 0);

    species.setAll(getAllSpecies());
}

BTW: Specie 是一个财务条款。生物物种仅为复数。