1. 程式人生 > >java JTable 動態拉取資料顯示及自動重新整理

java JTable 動態拉取資料顯示及自動重新整理

    網上有很多關於這方面的介紹,但是寫的要麼含糊,要麼不全,很容易讓開發者更加糊塗,本人最初也是這樣,所以在這裡把JTable 的動態資料拉取顯示以及自動重新整理的方法整理一下。
    JTable在java api中有下列幾種構造方法:

構造方法摘要
JTable()
構造一個預設的 JTable,使用預設的資料模型、預設的列模型和預設的選擇模型對其進行初始化。
JTable(int numRows, int numColumns)
使用 DefaultTableModel 構造具有 numRows 行和 numColumns 列個空單元格的 JTable。
JTable(Object[][] rowData, Object[] columnNames)
構造一個 JTable 來顯示二維陣列 rowData 中的值,其列名稱為 columnNames。
JTable(TableModel dm)
構造一個 JTable,使用資料模型 dm、預設的列模型和預設的選擇模型對其進行初始化。
JTable(TableModel dm, TableColumnModel cm)
構造一個 JTable,使用資料模型 dm、列模型 cm 和預設的選擇模型對其進行初始化。
JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)
構造一個 JTable,使用資料模型 dm、列模型 cm 和選擇模型 sm 對其進行初始化。
JTable(Vector rowData, Vector columnNames)
構造一個 JTable 來顯示 Vector 所組成的 Vector rowData 中的值,其列名稱為 columnNames。

前兩種屬於構造一個空的JTable和構造一個帶有幾行幾列的JTable,這都不是我們想要的,而後四種是需要傳入JTableModel以及Vector這些引數的,JTableModel屬於JTable的資料模型,而Vector類可以實現可增長的物件陣列 ,如果用這些引數去構造JTable的話,會很麻煩,而且對於重新整理也很不方便,所以這裡選用第三種,也就是用列名的一維陣列,和資料的二維陣列來構造JTable,對於動態顯示及重新整理都相當的方便。下面貼上程式碼
首先是domain

public class WebApp {

    /**
     * 商戶名稱
     */
    private
String tenantName; /** * 專案名稱 */ private String name; /** * 資料庫名稱 */ private String dbName; /** * 執行狀態 "成功" or "停止" */ private String status; public String getTenantName() { return tenantName; } public void setTenantName(String tenantName) { this
.tenantName = tenantName; } public void setDbName(String dbName) { this.dbName = dbName; } public String getDbName() { return dbName; } public String getName() { return name; } public String getStatus() { return status; } public void setName(String name) { this.name = name; } public void setStatus(String status) { this.status = status; } }

然後是初始化JTable的方法

public class JTableOperation{
    public JTable JtableDataInit(){
        MonitorService monitorService = new MonitorService();
        ArrayList<WebApp> webApps = monitorService.getTomcatWebAppData();

        Object[][] webAppsStr = new String[webApps.size()][4];
        //遍歷List
        for (int i = 0; i < webApps.size(); i++) {
            webAppsStr[i][0] = webApps.get(i).getTenantName();
            webAppsStr[i][1] = webApps.get(i).getName();
            webAppsStr[i][2] = webApps.get(i).getDbName();
            webAppsStr[i][3] = webApps.get(i).getStatus();
        }
        String[] Names={"商戶名稱","例項名","資料庫名稱","資料傳輸狀態"};
        JTable table=new JTable(webAppsStr,Names);
        table.setFont(new Font("Dialog",1,12));
        return table;
    }
}

然後是主呼叫方法

JTableOperation jTableInit = new JTableOperation();
JTable jTable = jTableInit.JtableDataInit();
JScrollPane scrollPane=new JScrollPane(jTable);
scrollPane.setPreferredSize(new Dimension(535, 540));
//增加監聽 這裡我重寫了監聽方法 如果只顯示與重新整理可不比新增監聽
jTable.addMouseListener(myActionListener);
//將scrollPane與jTable 新增到全域性變數中,這裡非常重要,下面介紹
GlobalObject.setjScrollPane(scrollPane);
GlobalObject.setjTable(jTable);

OK,這樣JTable的從後臺拉取資料然後初始化就能成功了,接下來是重頭戲,如何重新整理,這裡就用到了全域性變數,因為swing程式,變數,方法與類一般都是被new出來的,所以都是區域性性質的,而重新整理則需要用到全域性變數,需要將裝載JTable的面板容器scrollPane物件與列表jTbale物件 變成全域性變數

public class GlobalObject {

    /**
     * 全域性jScrollPane
     */
    public static JScrollPane jScrollPane;
    public static JScrollPane getjScrollPane() {
        return jScrollPane;
    }
    public static void setjScrollPane(JScrollPane jScrollPane) {
        GlobalObject.jScrollPane = jScrollPane;
    }

    /**
     * 全域性JTable
     */
    public static JTable jTable;
    public static JTable getjTable() {
        return jTable;
    }
    public static void setjTable(JTable jTable) {
        GlobalObject.jTable = jTable;
    }
}

在上上段程式碼中,將構造完畢的Jtable與面板set進了全域性變數中,然後就是重新整理方法

/**
     * 過載JTable 的資料 該方法在JTableOperation類中
     */
    public void reloadJTable(JTable jtable){

        MonitorService monitorService = new MonitorService();
        ArrayList<WebApp> webApps = monitorService.getTomcatWebAppData();

        String[] Names={"商戶名稱","例項名","資料庫名稱","資料傳輸狀態"};

        String[][] webAppsStr = new String[webApps.size()][4];
        //遍歷List
        for (int i = 0; i < webApps.size(); i++) {
            webAppsStr[i][0] = webApps.get(i).getTenantName();
            webAppsStr[i][1] = webApps.get(i).getName();
            webAppsStr[i][2] = webApps.get(i).getDbName();
            webAppsStr[i][3] = webApps.get(i).getStatus();
        }

        JTable table=new JTable(webAppsStr,Names);
        table.setFont(new Font("Dialog",1,12));
        //增加監聽
        MyActionListener myActionListener = new MyActionListener();
        table.addMouseListener(myActionListener);

        GlobalObject.setjTable(table);
        GlobalObject.getjScrollPane().setViewportView(table);
    }

全域性變數還有一個好處就是 在自動重新整理列表, 因為全域性變數可以執行緒共享比如每隔兩秒自動重新整理列表,就可以直接new 一個執行緒執行重新整理方法,然後sleep(2000)就OK了,很簡單,很方便,程式碼如下:

public class RefreshThread implements Runnable{

    @Override
    public void run() {

        while (true){
            try {
                //重新整理列表
                JTableOperation jTableOperation = new JTableOperation();
                jTableOperation.reloadJTable(GlobalObject.getjTable());
                //三秒重新整理
                Thread.sleep(2000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}