ITEEDU

swing的版面结构

版面管理器

事件处理

鼠标事件

键盘事件处理

窗口与面板的使用

JInternalFrame的使用(窗口与面板)

JTabbedPane,JScroolPane,JScrolBa的使用

标签与按钮的使用与介绍

[复选框、选项按钮、列表方框、下拉式列表的使用与介绍]

表格(Table)的使用与介绍

JTable的事件处理

1文字输入组件的使用与介绍

树(Tree)的使用与介绍

对话框(Option Pane与Dialog)的使用与介绍

菜单与工具栏的使用与介绍

文件选择对话框,颜色选择对话框,分隔线的使用与介绍.

Slider,Timer,Progress的使用

8-4: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()方法对运行结果不会造成影响 .