网上有很多关于这方面的介绍,但是写的要么含糊,要么不全,很容易让开发者更加糊涂,本人最初也是这样,所以在这里把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 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 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();
}
}
}
}