You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:15:47