我想创建一个动态布局的Swingtable,关于被设置为源的类数据。
更具体地说:
我有一个具有多个属性的类。当创建表时,我想这样做,这样表看起来:"哪个公共getFunction与返回类型字符串是可用的",并使用这个函数背后的属性作为columnname,后来也作为行源。
目前正在工作。
我的问题是:
如何使用这种方法确保列的特定顺序?例如,我有一个列"ID","呼号","类别"。
我想按这个顺序显示它们。
无论我如何排列源代码中的方法,列总是以相同的顺序("ID","category","callsign")。
java.lang.reflect.Method methodes[] = null;
methodes = classObjectOfT.getMethods();
List<String> tempList=new ArrayList<String>();
for (java.lang.reflect.Method m: methodes)
{
if (m.getReturnType().equals(String.class)&&m.getName().startsWith("get"))
{
tempList.add(m.getName().substring(3));
}
}
columnNames=(String[]) tempList.toArray(new String[tempList.size()]);
上面的是我用来检索列名的代码。
一个解决办法是命名属性/getmethods"ID_00","Callsign_01","Categorie_02",并通过使用字符串的最后2个字符做排序,但这将是相当丑陋的,我正在寻找一个更干净的解决方案。
我建议创建一个注释,用于定义表列的顺序和更多元数据,例如标签:
@Retention(RetentionPolicy.RUNTIME)
@interface TableColumn {
String label();
int order();
}
然后像这样检索它们:
public Set<Method> findTableColumsGetters(Class<TestTableData> clazz) {
Set<Method> methods = new TreeSet<>(new Comparator<Method>() {
@Override
public int compare(Method o1, Method o2) {
return Integer.valueOf(o1.getAnnotation(TableColumn.class).order())
.compareTo(o2.getAnnotation(TableColumn.class).order());
}
});
for(Method method : clazz.getMethods()) {
if(method.isAnnotationPresent(TableColumn.class)) {
methods.add(method);
}
}
return methods;
}
下面是一些测试:
测试表数据
static class TestTableData {
private String id, callsign, categorie;
@TableColumn(label = "Caterogy", order = 3)
public String getCategorie() {
return categorie;
}
public void setCategorie(String categorie) {
this.categorie = categorie;
}
@TableColumn(label = "Call sign", order = 2)
public String getCallsign() {
return callsign;
}
public void setCallsign(String callsign) {
this.callsign = callsign;
}
@TableColumn(label = "ID", order = 1)
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
测试:@Test
public void findTableColumsGetters() {
Set<Method> getters = findTableColumsGetters(TestTableData.class);
for(Method getter : getters) {
TableColumn annotation = getter.getAnnotation(TableColumn.class);
System.out.printf("%d %s (%s)%n", annotation.order(), annotation.label(), getter.getName());
}
}
输出:1 ID (getId)
2 Call sign (getCallsign)
3 Caterogy (getCategorie)
我建议您不要检索注释到达时间,您需要从中获取信息,而是为您的方法创建一个元数据类,您在执行搜索时将所有内容包括方法本身放在其中。