我认为每个Map的大小(条目数)在运行时不会改变,或者更好:存在固定的最大值条目。如果是这种情况,TableView
可以按照与标准属性(或Property
)相同的方式访问每个Entry
。 这里是一个修改后的类Person
。
public class PersonSimple {
String firstName;
String lastName;
String age;
Map<Integer, Double> map;
public PersonSimple(String fn, String ln, String age, Double gr0, Double gr1, Double gr2)
{
this.firstName = fn;
this.lastName = ln;
this.age = age;
map = new LinkedHashMap<>();
map.put(0, gr0);
map.put(1, gr1);
map.put(2, gr2);
}
public String getFirstName()
{
return firstName;
}
public String getLastName()
{
return firstName;
}
public String getAge()
{
return age;
}
private Double getFromMap(Integer key)
{
Set<Entry<Integer, Double>> s = map.entrySet();
Iterator<Entry<Integer, Double>> iter = s.iterator();
int index = 0;
while(iter.hasNext())
{
Entry<Integer, Double> e = iter.next();
if(index == key.intValue())
{
return e.getValue();
}
index++;
}
return null;
}
public Double getFM0()
{
return getFromMap(0);
}
public Double getFM1()
{
return getFromMap(1);
}
public Double getFM2()
{
return getFromMap(2);
}
}
正如你可以看到,每一个PersonSimple
有Map
必须持有三个条目。现在来诀窍。对于每个条目,您都定义了一个get方法。小心如何命名它们,因为这部分对与TableView
的交互至关重要。
以下代码显示如何将这些新方法连接到TableView
。
TableColumn firstNameCol = new TableColumn("First Name");
TableColumn lastNameCol = new TableColumn("Last Name");
TableColumn ageCol = new TableColumn("Age");
TableColumn aCol = new TableColumn("Assignment1");
TableColumn bCol = new TableColumn("Assignment2");
TableColumn cCol = new TableColumn("Assignment3");
table.getColumns().addAll(firstNameCol, lastNameCol, ageCol,aCol,bCol,cCol);
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));
lastNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("lastName"));
ageCol.setCellValueFactory(new PropertyValueFactory<Person,String>("age"));
aCol.setCellValueFactory(new PropertyValueFactory<Person,Double>("FM0"));
bCol.setCellValueFactory(new PropertyValueFactory<Person,Double>("FM1"));
cCol.setCellValueFactory(new PropertyValueFactory<Person,Double>("FM2"));
这是非常重要的,每个PropertyValueFactor
获得适合于在课堂PersonSimple
一开始的方法之一的名称。有关详细信息,请参见the TableView-API。
当然,我的方法并没有解决从动态映射中获取数据的问题,因为据我所知,在运行时在Java中添加新方法是不可能的。但是使用reflection-api来绕过这个限制可能会有一些技巧。
真棒,伟大的解决方案! –