目前使用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
答案 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>
,而不是两个不同的列表属性。