JTable 原始設定是不支援編輯儲存格的,也就是只能看而已,但是有時候就希望能直接編輯 JTable 比較方便,而不是透過一個對方框來編輯資料。這篇文章寫到一半才發現,原來 DefaultTableModel 是有支援儲存格編輯功能,而是我常用的 AbstractTableModel 不支援才對。

一開始用 Google 查了很多資料,發現不是叫人自製 CellEditor,不然就是教人用 DefaultCellEditor(JComboBox) 來加入 JComboBox。都沒有很簡單的直接按二下就可以開始編輯,到最後一行又會自動產生一行新的。

在 Google 資料的時候,發現 isCellEditable 是用來決定是否可以編輯的函數,但是卻存在 TableModel 裏面,而不能透過外面呼叫修改。在查看 TableModel 資料時又發現 setValueAt,猜想應該就是修改完會去呼叫儲存的函數。

果然,要啟動 JTable 編輯功能,只要實現 isCellEditable 及 setValueAt 即可。也就是要有編輯功能的 JTable,就必須自己實作 TableModel。JTable 所使用的 DefaultTableModel 雖然有編輯功能,但卻沒有自動產生一行新的功能,所以就必須自己寫一個 TableModel 才行。

import java.util.ArrayList; import java.util.List; import javax.swing.table.AbstractTableModel; @SuppressWarnings("serial") public class EditorTableModel extends AbstractTableModel { private List<Object> data; EditorTableModel () { data = new ArrayList<Object>(); } @Override public int getColumnCount() { return 2; } @Override public int getRowCount() { return data.size()+1; } @Override public Object getValueAt(int row, int col) { if (col == 0) { if (row == data.size()) return "new"; return row+1; } if (row < data.size()) return data.get(row); return null; } @Override public String getColumnName(int col) { if (col == 0) return "NO."; else return "input test"; } @Override public boolean isCellEditable(int row,int col) { if (col == 0) return false; return true; } @Override public void setValueAt(Object value, int row, int col) { if (row == data.size()) { if(((String)value).isEmpty()) return; data.add(value); this.fireTableDataChanged(); } else { data.set(row, value); } } }

上面的程式碼裏,最重要的就是 isCellEditable 函數,它限制只有 column 1 才可以編輯。還有 setValueAt 函數,它會把值修改並判斷最後一行被修改時,自動新增一行,記得要執行 fireTableDataChanged 才會通知 JTable 新增一行出來喔。

JScrollPane scrollPane = new JScrollPane(); JTable table = new JTable(new EditorTableModel()); scrollPane.setViewportView(table);

JTable 內的 editor 啟動有二個方法,第一個就是滑鼠雙擊儲存格就可以開始編輯;另一個是用鍵盤移動 focus cell,然後直接輸入即可,不過是直接在字尾加入,而不是清空再加入。另外用滑鼠雙擊方式編輯儲存格,按下 Enter 鍵時結束編輯仍留在原儲存格;而用鍵盤進入編輯,按 Enter 鍵結束編輯則會移到下一個可編輯的儲存格。所以總的來說,用鍵盤來操作 JTable Editor 是比較方便,用滑鼠則是懶人做法。

透過 jnlp 執行範例程式

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()