从组合框项目中选择时,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的项目插入到组合框中?我究竟做错了什么?谢谢,抱歉我的英文
答案 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 是一个财务条款。生物物种仅为复数。