我想创建一个带有动态布局的Swingtable,关于设置为源的类数据
更具体地说:
我有一个具有多个属性的类。在创建表时,我想这样做,以便表格看起来:“哪个公共getFunction与returntyp字符串可用”并使用此函数后面的属性作为列名,稍后也作为行的源。
目前正在努力。
我现在的问题是:
如何通过这种方法确保我的列的特定顺序?
例如,我有一个列“ID”,“呼号”,“类别”
我想按此顺序显示它们
我不知道如何在sourceCode中订购方法,列总是以相同的顺序排列(“ID”,“categories”,“callign”)。
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()]);
以上是我用于重新检索列名的代码。
一种解决方法是命名属性/ getMethodes“ID_00”,“Callsign_01”,“Categorie_02”,并使用字符串的最后2个字符进行排序,但这将是相当难看的,我正在搜索一个更清洁的解决方案。
答案 0 :(得分:1)
我建议您创建一个注释,用于定义表格的顺序和更多元数据,例如标签:
@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)
我建议你不要检索你需要信息的注释到达时间,而是为你的方法创建一个元数据类,你可以在执行搜索时将所有方法都包括在内。