如何用单个表模型创建带有POJO的JTable [英] how to create a JTable with POJOs with a single table model

查看:65
本文介绍了如何用单个表模型创建带有POJO的JTable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个GUI以显示数据库的内容.我正在为此使用JTable.我想要一个构造器,该构造器需要一个POJO列表,最后是列标题.我还希望我的JTable能够返回所选的POJO(例如,当我双击一行时).我真的需要为每个POJO创建一个表模型还是有更好的方法?

I’m trying to create a GUI to display the content of a database. I’m using a JTable for that. I want a constructor that takes a list of POJOs and eventually column titles. I want also my JTable to be able to return the selected POJO (for example when I doubleclick on a row). Do I really need to create a table model for each POJO or is there a better way?

我在类似的主题上进行了一些搜索,但没有找到任何答案,该答案针对所有POJO使用单个表模型,并且它们都没有返回POJO的方法.

I’ve made some searchs on similar topics, but I didn’t find any answer that uses a single table model for all POJOs and none of them has a method that returns a POJO.

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

Here is the description of my database tables and POJOs:

数据库表:

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

POJO:

  • 等级(int id,字符串等级)
  • 学生(int ID,字符串姓氏,字符串姓氏,年级)
  • 作者(整数id,字符串姓氏,字符串姓氏,国籍)
  • 国籍(int id,字符串国籍)
  • 书(int id,字符串标题,作者,学生)

推荐答案

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

Here is as example of solution using reflection and annotations.

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;
    }
}

-

@Retention(RetentionPolicy.RUNTIME)
public @interface Order {
    int value(); 
}

-

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ColumnName {
    String value(); 
}

-

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Updatable {
    boolean value(); 
}

-

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()); 
    }

}

-

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(); 
    }
}

这篇关于如何用单个表模型创建带有POJO的JTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆