连续返回字符串 - 数据被ArrayList

时间:2017-04-28 19:03:13

标签: java javafx

目前使用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和getters)

 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

1 个答案:

答案 0 :(得分:1)

方法setAll(...)将您目前列表中的所有元素替换为您提供的元素(&#34;将它们全部设置为#34;)。因此,每次遍历循环时,都会用当前元素替换所有元素。最后,表格中只有一个元素。

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>,而不是两个不同的列表属性。