TableColumnModel:

来源:互联网 发布:淘宝网上怎么搜索买烟 编辑:程序博客网 时间:2024/05/16 17:43

TableColumnModel:

TableColumnModel本身是一个Interface,里面定义了许多与表格的"列(行)"有关的方法,例如增加列,删除列,设置与取得"列"的相关信 息.通常我们不会直接实现TableColumnModel界面,而是会利用JTable的getColumnModel()方法取得TableColumnModel对象,再利用此对象对 字段做设置.举例来说,如果我们想设计的表格是包括有下拉式列表的Combo Box,我们就能利用TableColumnModel来达到这样的效果.

我们先看看下面的例子:

import javax.swing.table.AbstractTableModel;import javax.swing.*;import java.awt.*;import java.awt.event.*;public class ColumnModelTest{         public ColumnModelTest() {       JFrame f = new JFrame();   /*由于我们的MyTable类继承了AbstractTableModel并且实作了getColmunCount(),getRowCount(),getValueAt()方法.因此我们可以通    *过MyTable来产生TableModel的实体.    */    MyTable mt=new MyTable();   JTable t=new JTable(mt);//我们利用MyTable来建立JTable.   JComboBox c = new JComboBox();//建立一个JComboBox的对象.   c.addItem("Taipei");//我们在新建立的JComboBox对象里新增三个项目.   c.addItem("ChiaYi");   c.addItem("HsinChu");    /*我们利用JTable所提供的getTableColumnModel()方法取得TableColumnModel对象,再由TableColumnModel类所提供的getColumn()方     *法取得TableColumn对象,TableColumn类可针对表格中的每一行做具体的设置,例如设置字段的宽度,某行的标头,设置输入较复杂的     *数据类型等等.在这里,我们利用TableColumn类所提供的setCellEditor()方法,将JComboBox作为第二行的默认编辑组件.     */   t.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(c));   t.setPreferredScrollableViewportSize(new Dimension(550, 30));        JScrollPane s = new JScrollPane(t);                f.getContentPane().add(s, BorderLayout.CENTER);    f.setTitle("ColumnModelTest");        f.pack();        f.setVisible(true);                f.addWindowListener(new WindowAdapter() {            public void windowClosing(WindowEvent e) {                System.exit(0);            }        });    }    public static void main(String args[]) {            new ColumnModelTest();    }      }class MyTable extends AbstractTableModel{        Object[][] p = {            {"阿呆", "Taipei",new Integer(66),               new Integer(32), new Integer(98), new Boolean(false),new Boolean(false)},            {"阿瓜", "ChiaYi",new Integer(85),               new Integer(69), new Integer(154), new Boolean(true),new Boolean(false)},                  };        String[] n = {"姓名",                  "居住地",                      "语文",                      "数学",                      "总分",                      "及格",                               "作弊"};            public int getColumnCount() {            return n.length;        }        public int getRowCount() {            return p.length;        }        public String getColumnName(int col) {            return n[col];        }        public Object getValueAt(int row, int col) {            return p[row][col];        }    public Class getColumnClass(int c) {        return getValueAt(0, c).getClass();    }    /*public boolean isCellEditable(int rowIndex, int columnIndex) {    return true;    }    public void setValueAt(Object value, int row, int col) {        p[row][col] = value;    fireTableCellUpdated(row, col);    }*/}

读者运行此程序可以发现,利用继承AbstractTableModel抽象类所产生的JTable的内容是不能被修改的.那如果想要让用户可以修改表格 中的某一个字段,例如勾选Check Box或是直接修改某个字段的数字,该怎么做呢?很简单,只要我们在范例中的MyTable类中覆写AbstractTab leModel抽象类中的isCellEditable()方法即可.下面即是isCellEditable()的实作:

public boolean isCellEditable(int rowIndex,int columnIndex){     return true;}  

在isCellEditable()中,我们只有一行简单的程序代码:return true,意思是将我们表格内的每个cell都变成可修改.但仅仅修改这个程 序代码还不行,你可以发现虽然表格现在变成了可以修改了,但更改完之后按下[Enter]键,内容马上恢复成原有的值!解决的方法是覆写 AbstractTableModel抽象类中的setValueAt()方法,这个方法主要是让我们将改过的值存入表格中,如下所示:

public void setValueAt(Object value,int row,int col){     p[row][col]=value;     fireTableCellUpdated(row,col);}  

其中value为我们所更改的值,我们将value存入p[row][col]中,并且调用firTableCellUpdated()函数来告诉我们的系统表格已经做了更 改了,关于这一部份,我们后面会再对事件处理作详细地介绍,在此范例中有没有加入fireTableCellUpdated()方法对运行结果不会造成影响 .