当前使用JavaFX创建一个tableview并遇到了这个问题,它只是将数组的最后一个元素追加(因为所有其他元素都被覆盖了。)

public  void companyTable() {
   for(CompanyData s: companydataList()){
       companyDataTableView.getItems().setAll(s);
   }
}


其中companyDataList是:

 private List<CompanyData> companydataList(){
        CompanyData company = new CompanyData("test",9,1);

        for(String i : sim.getCompanyNames()) {
           company.setPFCompanyName(i);
       }

       for(int j : sim.getCompanyValues()) {
           company.setPFShareValues(j);
       }
        List<CompanyData> companydata = new ArrayList<>();
        companydata.add(company);

        return companydata;
    }


数据被添加到此(字符串的Setter和getter)

 private final StringProperty PFCompanyName;
    private final IntegerProperty PFShareValues;

    public CompanyData(String CompanyName, int ShareValue, int ClosingPence) {
        this.PFCompanyName = new SimpleStringProperty(CompanyName);
        this.PFShareValues = new SimpleIntegerProperty(ShareValue);
    }

    public String getPFCompanyName() {
        return PFCompanyName.get();
    }

    public StringProperty PFCompanyNameProperty() {
        return PFCompanyName;
    }

    public void setPFCompanyName(String PFCompanyName) {
        this.PFCompanyName.set(PFCompanyName);
    }

    public int getPFShareValues(int j) {
        return PFShareValues.get();
    }

    public IntegerProperty PFShareValuesProperty() {
        return PFShareValues;
    }

    public void setPFShareValues(int PFShareValues) {
        this.PFShareValues.set(PFShareValues);
    }


当前输出为:

CompanyName             CompanyValue
Samsung                   1093


但是我想要的是:

CompanyName             CompanyValue
Nokia                        3
Apple                        1
HTC                          9
Samsung                     1093

最佳答案

方法setAll(...)用您提供的元素替换列表中当前的所有元素(“全部设置”)。因此,每次迭代循环时,都将所有元素替换为当前元素。最后,表中将只有一个元素。

ObservableList是标准java.util.List的子类型,因此您可以调用任何标准列表方法。例如。您可以只添加每个元素:

public  void companyTable() {
   for(CompanyData s: companydataList()){
       companyDataTableView.getItems().add(s);
   }
}


当然,您实际上并不需要自己编写循环,只需将它们全部添加即可:

public  void companyTable() {
    companyDataTableView.getItems().addAll(companydataList());
}


或者,如果您需要的话,将它们全部设置:

public  void companyTable() {
    companyDataTableView.getItems().setAll(companydataList());
}


此外,您的companydataList()方法仅创建一个CompanyData实例,然后不断对其进行更改。这是您当前的实现,其中的注释说明了您编写的每一行的功能:

private List<CompanyData> companydataList(){

    // create a single instance:
    CompanyData company = new CompanyData("test",9,1);

    // repeatedly change the name of that instance:
    for(String i : sim.getCompanyNames()) {
       company.setPFCompanyName(i);
   }

   // repeatedly change the value of that instance:
   for(int j : sim.getCompanyValues()) {
       company.setPFShareValues(j);
   }

   // create an empty list:
    List<CompanyData> companydata = new ArrayList<>();

    // add one object to the list
    companydata.add(company);

    // return the list containing the single object:
    return companydata;
}


您需要为每个CompanyData / name对创建一个value实例,并将每个实例添加到列表中。假设sim.getCompanyNames()sim.getCompanyValues()返回长度相同的列表(或数组;我假设它们是列表),则需要执行以下操作

private List<CompanyData> companydataList(){


   List<String> companyNames = sim.getCompanyNames();
   List<Integer> companyValues = sim.getCompanyValues();

   List<CompanyData> companydata = new ArrayList<>();

   for (int i = 0 ; i < companyNames.size(); i++) {
       String name = companyNames.get(i);
       int value = companyValues.get(i);
       CompanyData company = new CompanyData();
       company.setPFCompanyName(name);
       company.setPFShareValues(value);
       companydata.add(company);
    }
    return companydata;
}


显然,让sim(我认为是某种数据访问器)首先直接返回List<CompanyData>,而不是为不同的属性创建两个不同的列表,这会更明智。

10-07 15:51