java的表格2007-05-29 yycnet.yeah.net yyc译和树状物一样,表格在Swing相当的庞大和强大。它们最初有意被设计成以Java数据库连结(JDBC,在15章有介绍)为媒介的“网格”数据库接口,并且因此它们拥有的巨大的灵活性,使我们不再感到复杂。无疑,这是足以成为成熟的电子数据表的基础条件而且可能为整本书提供很好的根据。但是,如果我们理解这个的基础条件,它同样可能创建相关的简单的Jtable。
JTable控制数据的显示方式,但TableModel控制它自己的数据。因此在我们创建JTable前,应先创建一个TableModel。我们可以全部地执行TableModel接口,但它通常从helper类的AbstractTableModel处简单地继承:
//: Table.java// Simple demonstration of JTablepackage 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方法。