当前使用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>
,而不是为不同的属性创建两个不同的列表,这会更明智。