【问题标题】:How insert items to tableview with bind to combobox?如何通过绑定到组合框将项目插入表格视图?
【发布时间】:2018-01-26 05:10:24
【问题描述】:

当从组合框项目中选择时,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

是否可以将带有绑定 tableview 的项目插入到组合框?我究竟做错了什么?感谢和对不起我的英语

【问题讨论】:

    标签: javafx combobox tableview


    【解决方案1】:

    如果不解除绑定,则无法修改已绑定属性的值。 (绑定意味着保持绑定属性的值与其他属性的值相同。)
    您可能应该简单地向 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());
    }
    

    顺便说一句:Specie 是一个财务术语。生物物种只有复数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2012-08-23
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多