如何在TableView中使用抽象类Persoon的ArrayList展示Lid实例数据
嘿,我来帮你搞定这个TableView的问题!要实现只展示Vereniging里的Lid实例,同时显示父类Persoon的属性和Lid自己的rol,可以按下面这几步来:
第一步:先给你的类补上Getter方法
JavaFX的TableColumn需要通过Getter方法来获取属性值,你提供的代码里没有这些方法,所以首先得给Persoon和Lid添加对应的Getter:
Persoon类补充Getter:
public abstract class Persoon implements Comparable<Persoon> { // 你的原有代码... public String getVoornaam() { return voornaam; } public String getTussenvoegsel() { return tussenvoegsel; } public String getAchternaam() { return achternaam; } public String getWoonplaats() { return woonplaats; } public String getGeslacht() { return geslacht; } public String getRekeningnr() { return rekeningnr; } // 原有compareTo方法... }
Lid类补充Getter:
public class Lid extends Persoon { // 你的原有代码... public String getRol() { return rol; } // 如果需要展示gebnaam或wachtwoord,也可以加上对应的getter }
第二步:过滤出所有Lid实例
Vereniging的personen列表里混着Lid和Medewerker,我们需要先把Lid筛选出来:
// 假设你已经有一个Vereniging实例 Vereniging mijnVereniging = new Vereniging("Mijn Vereniging"); // 用Stream过滤并转换为Lid列表 List<Lid> alleLeden = mijnVereniging.getPersonen().stream() .filter(persoon -> persoon instanceof Lid) // 只保留Lid类型 .map(persoon -> (Lid) persoon) // 强制转换为Lid .collect(Collectors.toList());
第三步:创建TableView和对应的列
接下来就可以构建TableView,把Persoon的属性和Lid的rol都做成列:
// 创建TableView,泛型指定为Lid TableView<Lid> lidTable = new TableView<>(); // 创建Persoon属性的列 TableColumn<Lid, String> voornaamCol = new TableColumn<>("Voornaam"); voornaamCol.setCellValueFactory(new PropertyValueFactory<>("voornaam")); // 对应getVoornaam() TableColumn<Lid, String> tussenvoegselCol = new TableColumn<>("Tussenvoegsel"); tussenvoegselCol.setCellValueFactory(new PropertyValueFactory<>("tussenvoegsel")); TableColumn<Lid, String> achternaamCol = new TableColumn<>("Achternaam"); achternaamCol.setCellValueFactory(new PropertyValueFactory<>("achternaam")); TableColumn<Lid, String> woonplaatsCol = new TableColumn<>("Woonplaats"); woonplaatsCol.setCellValueFactory(new PropertyValueFactory<>("woonplaats")); TableColumn<Lid, String> geslachtCol = new TableColumn<>("Geslacht"); geslachtCol.setCellValueFactory(new PropertyValueFactory<>("geslacht")); TableColumn<Lid, String> rekeningnrCol = new TableColumn<>("Rekeningnummer"); rekeningnrCol.setCellValueFactory(new PropertyValueFactory<>("rekeningnr")); // 创建Lid的rol列 TableColumn<Lid, String> rolCol = new TableColumn<>("Rol"); rolCol.setCellValueFactory(new PropertyValueFactory<>("rol")); // 把所有列添加到TableView lidTable.getColumns().addAll(voornaamCol, tussenvoegselCol, achternaamCol, woonplaatsCol, geslachtCol, rekeningnrCol, rolCol); // 将过滤后的Lid列表转为ObservableList,设置为TableView的数据源 lidTable.setItems(FXCollections.observableArrayList(alleLeden));
进阶:实时更新列表(可选)
如果希望Vereniging的personen列表变化时,TableView能自动更新显示,你可以用FilteredList和Bindings来实现:
// 把原列表转为ObservableList ObservableList<Persoon> observablePersonen = FXCollections.observableArrayList(mijnVereniging.getPersonen()); // 创建过滤列表,只保留Lid FilteredList<Persoon> filteredLeden = new FilteredList<>(observablePersonen, p -> p instanceof Lid); // 绑定为Lid的ObservableList,原列表变化时自动更新 ObservableList<Lid> observableLeden = Bindings.createObjectBinding(() -> filteredLeden.stream() .map(p -> (Lid) p) .collect(Collectors.toCollection(FXCollections::observableArrayList)), filteredLeden ); lidTable.setItems(observableLeden);
这样以后你给mijnVereniging.getPersonen()添加或删除Lid时,TableView会自动同步更新~
内容的提问来源于stack exchange,提问作者MrEmper
相关产品推荐
相关产品推荐

