因為公司的項目要求最近接觸了點SWING的東西,用到了jtable,原本
使用類似
Object[][] o;
jTable1.setModel(new javax.swing.table.DefaultTableModel(o, new String[]{
"行號", "倉庫名稱", "化學品名稱", "計量單位", "已記錄庫存", "實際庫存", "是否一致"
}
我們只需要根據我們數據量的大小動態的初始化Object[][] o的大小,然后下面一個一個賦值,比如
O[0][0]表示第一行第一列的值,一個一個賦值,然后
jTable1.repaint();重新繪圖就可以了。
顯示方法具體就不介紹了,我想介紹下逐行顯示的問題。如果數據量小的話,你直接用上面的就可以了。
但是數據量大的時候,得到我們的數據可能就要很長的時間,反正是所有的賦值結束才能顯示出來。于是我們就想有逐行顯示的效果。
然后你會發現一個增加一行的方法,是這樣的
model.insertRow(table.getSelectedRow(), new Object[] {
"追加列_0_0_0", "追加列_0_0_0", "追加列_0_0_0" });
調用這個就可以往最后增加一行
也許一開始我們肯定都是這樣,有個監聽觸發
類似如下:
publicvoid actionPerformed(ActionEvent e) {
//1.得到我們要顯示的數據集合
//2.循環調用上面的 insertRow方法
//我就用個循環代替下
for(int i=0;i<100;i++){
model.insertRow(model.getRowCount(), new Object[] { "追加列_0_0",
"追加列_0_0", "追加列_0_0" });
Thread.sleep(1000);
}
}
我們期待的結果:
插了一行,過了一秒,下一行出來了
實際的結果呢?
等著,沒反應,最后100條一起顯示出現。
實際上這個問題我困惑了蠻久,最后終于發現了原因,只要是監聽,只有等等個監聽方法執行完畢了,它才開始刷新界面。你調用什么刷新方法都是沒用的。
那么我們怎么解決呢?
當然是線程拉,簡單的講就是監聽方法只負責啟動線程。
插入的部分放到線程的RUN里。
類似下面:
publicvoid actionPerformed(ActionEvent e) {
Thread thread= new Thread(this);
thread.start();
}
publicvoid run() {
// TODO Auto-generated method stub
while(true){
model.insertRow(model.getRowCount(), new Object[] { "追加列_0_0",
"追加列_0_0", "追加列_0_0" });
// System.out.println(model.getRowCount());
Thread.currentThread().sleep(1000);
}
}
這只是一個示例,實際的情況是還需要去數據庫取藥顯示的集合,我給大家一個建議
啟兩個線程,一個線程負責查詢集合,一個線程負責插入,
插入的線程需要實時的查看數據集合是否有新的數據,有馬上顯示出來。
這樣的話,即使計算量很大,我們也不需要全部計算完成,才可以一條條顯示,增加喲過戶體驗哦。
給大家一個可以運行的JAVA文件吧,有興趣的可以下載來看看那。
點中間那個按鈕絕對一行行逐行顯示的。
Jtable.java