因?yàn)楣镜捻?xiàng)目要求最近接觸了點(diǎn)SWING的東西,用到了jtable,原本
使用類似
Object[][] o;
jTable1.setModel(new javax.swing.table.DefaultTableModel(o, new String[]{
"行號(hào)", "倉(cāng)庫(kù)名稱", "化學(xué)品名稱", "計(jì)量單位", "已記錄庫(kù)存", "實(shí)際庫(kù)存", "是否一致"
}
我們只需要根據(jù)我們數(shù)據(jù)量的大小動(dòng)態(tài)的初始化Object[][] o的大小,然后下面一個(gè)一個(gè)賦值,比如
O[0][0]表示第一行第一列的值,一個(gè)一個(gè)賦值,然后
jTable1.repaint();重新繪圖就可以了。
顯示方法具體就不介紹了,我想介紹下逐行顯示的問(wèn)題。如果數(shù)據(jù)量小的話,你直接用上面的就可以了。
但是數(shù)據(jù)量大的時(shí)候,得到我們的數(shù)據(jù)可能就要很長(zhǎng)的時(shí)間,反正是所有的賦值結(jié)束才能顯示出來(lái)。于是我們就想有逐行顯示的效果。
然后你會(huì)發(fā)現(xiàn)一個(gè)增加一行的方法,是這樣的
model.insertRow(table.getSelectedRow(), new Object[] {
"追加列_0_0_0", "追加列_0_0_0", "追加列_0_0_0" });
調(diào)用這個(gè)就可以往最后增加一行
也許一開始我們肯定都是這樣,有個(gè)監(jiān)聽觸發(fā)
類似如下:
publicvoid actionPerformed(ActionEvent e) {
//1.得到我們要顯示的數(shù)據(jù)集合
//2.循環(huán)調(diào)用上面的 insertRow方法
//我就用個(gè)循環(huán)代替下
for(int i=0;i<100;i++){
model.insertRow(model.getRowCount(), new Object[] { "追加列_0_0",
"追加列_0_0", "追加列_0_0" });
Thread.sleep(1000);
}
}
我們期待的結(jié)果:
插了一行,過(guò)了一秒,下一行出來(lái)了
實(shí)際的結(jié)果呢?
等著,沒反應(yīng),最后100條一起顯示出現(xiàn)。
實(shí)際上這個(gè)問(wèn)題我困惑了蠻久,最后終于發(fā)現(xiàn)了原因,只要是監(jiān)聽,只有等等個(gè)監(jiān)聽方法執(zhí)行完畢了,它才開始刷新界面。你調(diào)用什么刷新方法都是沒用的。
那么我們?cè)趺唇鉀Q呢?
當(dāng)然是線程拉,簡(jiǎn)單的講就是監(jiān)聽方法只負(fù)責(zé)啟動(dòng)線程。
插入的部分放到線程的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);
}
}
這只是一個(gè)示例,實(shí)際的情況是還需要去數(shù)據(jù)庫(kù)取藥顯示的集合,我給大家一個(gè)建議
啟兩個(gè)線程,一個(gè)線程負(fù)責(zé)查詢集合,一個(gè)線程負(fù)責(zé)插入,
插入的線程需要實(shí)時(shí)的查看數(shù)據(jù)集合是否有新的數(shù)據(jù),有馬上顯示出來(lái)。
這樣的話,即使計(jì)算量很大,我們也不需要全部計(jì)算完成,才可以一條條顯示,增加喲過(guò)戶體驗(yàn)哦。
給大家一個(gè)可以運(yùn)行的JAVA文件吧,有興趣的可以下載來(lái)看看那。
點(diǎn)中間那個(gè)按鈕絕對(duì)一行行逐行顯示的。
Jtable.java