和樹狀物一樣,表格在Swing相當的龐大和強大。它們最初有意被設計成以Java數據庫連結(JDBC,在15章有介紹)為媒介的“網格”數據庫接口,並且因此它們擁有的巨大的靈活性,使我們不再感到復雜。無疑,這是足以成為成熟的電子數據表的基礎條件而且可能為整本書提供很好的根據。但是,如果我們理解這個的基礎條件,它同樣可能創建相關的簡單的Jtable。
JTable控制數據的顯示方式,但TableModel控制它自己的數據。因此在我們創建JTable前,應先創建一個TableModel。我們可以全部地執行TableModel接口,但它通常從helper類的AbstractTableModel處簡單地繼承:
//: Table.java // Simple demonstration of JTable package c13.swing; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; // The TableModel controls all the data: class DataModel extends AbstractTableModel { Object[][] data = { {"one", "two", "three", "four"}, {"five", "six", "seven", "eight"}, {"nine", "ten", "eleven", "twelve"}, }; // Prints data when table changes: class TML implements TableModelListener { public void tableChanged(TableModelEvent e) { for(int i = 0; i < data.length; i++) { for(int j = 0; j < data[0].length; j++) System.out.print(data[i][j] + " "); System.out.println(); } } } DataModel() { addTableModelListener(new TML()); } public int getColumnCount() { return data[0].length; } public int getRowCount() { return data.length; } public Object getValueAt(int row, int col) { return data[row][col]; } public void setValueAt(Object val, int row, int col) { data[row][col] = val; // Indicate the change has happened: fireTableDataChanged(); } public boolean isCellEditable(int row, int col) { return true; } }; public class Table extends JPanel { public Table() { setLayout(new BorderLayout()); JTable table = new JTable(new DataModel()); JScrollPane scrollpane = JTable.createScrollPaneForTable(table); add(scrollpane, BorderLayout.CENTER); } public static void main(String args[]) { Show.inFrame(new Table(),200,200); } } ///:~
DateModel包括一組數據,但我們同樣能從其它的地方得到數據,例如從數據庫中。構建器增加了一個TableModelListener用來在每次表格被改變後打印數組。剩下的方法都遵循Bean的命名規則,並且當JTable需要在DateModel中顯示信息時調用。AbstractTableModel提供了默認的setValueAt()和isCellEditable()方法以防止修改這些數據,因此如果我們想修改這些數據,就必須過載這些方法。
一旦我們擁有一個TableModel,我們只需要將它分配給JTable構建器即可。所有有關顯示,編輯和更新的詳細資料將為我們處理。注意這個程序例子同樣將JTable放置在JScrollPane中,這是因為JScrollPane需要一個特殊的JTable方法。