首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用带有单个表模型的POJO创建JTable

如何使用带有单个表模型的POJO创建JTable
EN

Stack Overflow用户
提问于 2016-08-09 11:35:58
回答 3查看 1.1K关注 0票数 0

我试图创建一个GUI来显示数据库的内容。我用的是一个JTable。我想要一个构造函数,它接收POJO的列表,最后是列标题。我还希望我的JTable能够返回所选的POJO (例如,当我双击一行时)。我真的需要为每个POJO创建一个表模型吗?还是有更好的方法?

我已经对类似的主题进行了一些搜索,但是我没有找到任何对所有POJO使用单一表模型的答案,而且它们都没有返回POJO的方法。

下面是我的数据库表和POJO的描述:

数据库表:

  • 学生(id,名字,姓氏,生日,grade_id,电话号码)
  • 职等(id,职等)
  • 作者(id,名字,姓氏,nationality_id)
  • 国籍(身份证,国籍)
  • 书籍(id,title,author_id,student_id)

POJO:

  • 等级(int id,字符串级别)
  • 学生(int id,字符串名,字符串姓氏,年级)
  • 作者(int id,字符串名,字符串姓氏,国籍)
  • 国籍(int id,字符串国籍)
  • 书籍(int id,字符串标题,作者,学生学生)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-10 08:17:51

下面是使用反射和注释的解决方案示例。

代码语言:javascript
复制
public class Worker {

    @Updatable(false)
    @Order(1)
    @ColumnName("ID")
    private int id; 

    @Updatable(true)
    @Order(2)
    @ColumnName("FIRST NAME")
    private String firstName; 

    @Updatable(true)
    @Order(3)
    @ColumnName("LAST NAME")
    private String lastName; 

    public Worker() {
    }

    public Worker(int id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Order(1)
    public int getId() {
        return id;
    }

    @Order(1)
    public void setId(int id) {
        this.id = id;
    }

    @Order(2)
    public String getFirstName() {
        return firstName;
    }

    @Order(2)
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Order(3)
    public String getLastName() {
        return lastName;
    }

    @Order(3)
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

-

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
public @interface Order {
    int value(); 
}

-

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ColumnName {
    String value(); 
}

-

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Updatable {
    boolean value(); 
}

-

代码语言:javascript
复制
public class ComparatorReflection<T extends AccessibleObject & Member> implements Comparator<T>{

    @Override
    public int compare(T o1, T o2) {
        Order or1 = o1.getAnnotation(Order.class); 
        Order or2 = o2.getAnnotation(Order.class); 
        if (or1 != null && or2 != null && or1.value() - or2.value() != 0) {
            return or1.value() - or2.value(); 
        }
        return o1.getName().compareTo(o2.getName()); 
    }

}

-

代码语言:javascript
复制
public class ModelDAO extends AbstractTableModel {

    private List<?> data; 

    public ModelDAO(List data) {
        this.data = data;
    }

    @Override
    public int getRowCount() {
        return this.data.size(); 
    }

    @Override
    public int getColumnCount() {
        return data.get(0).getClass().getDeclaredFields().length; 
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        try {
            Method[] methods = data.get(rowIndex).getClass().getDeclaredMethods(); 
            Arrays.sort(methods, new ComparatorReflection<Method>()); 
            return methods[2*columnIndex].invoke(data.get(rowIndex), null);
        } catch (Exception ex) {
            ex.printStackTrace(); 
        }
        throw new UnsupportedOperationException("Not supported yet."); 
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        Field[] fields = data.get(0).getClass().getDeclaredFields(); 
        Arrays.sort(fields, new ComparatorReflection<Field>()); 
        return fields[columnIndex].getType(); 
    }

    @Override
    public String getColumnName(int column) {
        Field[] fields = data.get(0).getClass().getDeclaredFields(); 
        Arrays.sort(fields, new ComparatorReflection<Field>()); 
        return fields[column].getAnnotation(ColumnName.class).value(); 
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        Field[] fields = data.get(rowIndex).getClass().getDeclaredFields(); 
        Arrays.sort(fields, new ComparatorReflection<Field>()); 
        return fields[columnIndex].getAnnotation(Updatable.class).value(); 
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-09 11:41:57

我猜有人已经创建了一个由bean getter和setter支持的通用TableModel。尝试搜索ReflectionTableModelBeanTableModel

如果做不到这一点,那么使用TableModel很简单地滚动您自己的反射api

票数 2
EN

Stack Overflow用户

发布于 2016-08-09 15:49:33

看看行表模型。它提供了对TableModel方法的通用支持。您需要为POJO的特定字段实现几个方法。

或者你可以使用Bean表模型。它使用POJO上的反射来创建TableModel。它扩展了RowTableModel

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38849635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档