簡體   English   中英

如何用單個表模型創建帶有POJO的JTable

[英]how to create a JTable with POJOs with a single table model

我正在嘗試創建一個GUI以顯示數據庫的內容。 我正在為此使用JTable。 我想要一個構造器,該構造器需要一個POJO列表,最后是列標題。 我還希望我的JTable能夠返回所選的POJO(例如,當我雙擊一行時)。 我真的需要為每個POJO創建一個表模型還是有更好的方法?

我在類似的主題上進行了一些搜索,但是沒有找到任何對所有POJO使用單個表模型的答案,而且它們都沒有返回POJO的方法。

這是我的數據庫表和POJO的描述:

數據庫表:

  • 學生(id,名字,姓氏,生日,grade_id,電話號碼)
  • 年級(id,年級)
  • 作者(ID,名字,姓氏,國籍ID)
  • 國籍(身份證,國籍)
  • 書籍(編號,標題,作者編號,學生編號)

POJO:

  • 等級(int id,字符串等級)
  • 學生(int id,字符串名,字符串姓氏,年級)
  • 作者(整數id,字符串姓氏,字符串姓氏,國籍)
  • 國籍(int id,字符串國籍)
  • 書籍(int id,字串標題,作者,學生)

我猜有人已經創建了一個由bean getter和setter支持的通用TableModel 嘗試谷歌搜索ReflectionTableModelBeanTableModel

失敗的話,使用反射API來滾動自己的TableModel會非常簡單

查看行表模型 它為TableModel方法提供一般支持。 您將需要為POJO的特定字段實現幾種方法。

或者,您可以使用Bean表模型 它在POJO上使用反射來創建TableModel 它擴展了RowTableModel

這是使用反射和注釋的解決方案示例。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM