JTable DefaultTableModel

DefaultTableModel

我们曾提到过DefaultTableModel类,并说明了此类是继承AbstractTableModel抽象类而来,且实现了getColumnCount(),getRowCount() 与getValueAt()3个方法.因此在实际的使用上,DefaultTableModel比AbstractTableModel要来得简单许多,也较常被拿来使用 .DefaultTableModel内部使用Vector来使用表格的数据,若佻所要显示的表格格式是比较单纯的变化,笔者建议使用DefaultTableModel类会 来得方便也简单许多.若佻所要显示的数据模式非常复杂,例如我们所举的成绩表格外加学生选课信息等,像这类的表格通常显示的信息会因 人面异,因此使用AbstractTableModel会比较容易设计些.

下面是DefaultTableModel的构造函数:
  • DefaultTableModel():建立一个DefaultTableModel,里面没有任何数据.
  • DefaultTableModel(int numRows,int numColumns):建立一个指定行列数的DefaultTableModel.
  • DefaultTableModel(Object[][] data,Object[] columnNames):建立一个DefaultTableModel,输入数据格式为Object Array.系统会 自动调用setDataVector()方法来设置数据。
  • DefaultTableModel(Object[] columnNames,int numRows):建立一个DefaultTableModel,并具有Column Header名称与行数信息。
  • DefaultTableModel(Vector columnNames,int numRows):建立一个DefaultTableModel,并具有column Header名称与行数信息。
  • DefaultTableModel(Vector data,Vector columnNames):建立一个DefaultTableModel,输入数据格式为Vector.系统会自动调用 setDataVector()方法来设置数据。

DefaultTableModel类提供相当多好用的方法,如之前我们谈论过的getColumnCount(),getRowCount(),getValueAt(),isCellEditable() setValueAt()等方法,均可直接使用。且DefaultTableModel也提供了addColumn()与addRow()等方法,可让我们随时增加表格的数据。下 面我们就举一个动态增加表格字段的例子:

import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class AddRemoveCells implements ActionListener {
	JTable table = null;
	DefaultTableModel defaultModel = null;

	public AddRemoveCells() {
		JFrame f = new JFrame();
		String[] name = { "字段 1", "字段 2", "字段 3", "字段 4", "字段 5" };
		String[][] data = new String[5][5];
		int value = 1;
		for (int i = 0; i < data.length; i++) {
			for (int j = 0; j < data[i].length; j++)
				data[i][j] = String.valueOf(value++);
		}

		defaultModel = new DefaultTableModel(data, name);
		table = new JTable(defaultModel);
		table.setPreferredScrollableViewportSize(new Dimension(400, 80));
		JScrollPane s = new JScrollPane(table);

		JPanel panel = new JPanel();
		JButton b = new JButton("增加行");
		panel.add(b);
		b.addActionListener(this);
		b = new JButton("增加列");
		panel.add(b);
		b.addActionListener(this);
		b = new JButton("删除行");
		panel.add(b);
		b.addActionListener(this);
		b = new JButton("删除列");
		panel.add(b);
		b.addActionListener(this);

		Container contentPane = f.getContentPane();
		contentPane.add(panel, BorderLayout.NORTH);
		contentPane.add(s, BorderLayout.CENTER);

		f.setTitle("AddRemoveCells");
		f.pack();
		f.setVisible(true);

		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	/*
	 * 要删除列必须使用TableColumnModel界面定义的removeColumn()方法。因此我闪先由JTable类的getColumnModel
	 * ()方法取得
	 * TableColumnModel对象,再由TableColumnModel的getColumn()方法取得要删除列的TableColumn
	 * .此TableColumn对象当作是
	 * removeColumn()的参数。删除此列完毕后必须重新设置列数,也就是使用DefaultTableModel的setColumnCount
	 * ()方法来设置。
	 */
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("增加列"))
			defaultModel.addColumn("增加列");
		if (e.getActionCommand().equals("增加行"))
			defaultModel.addRow(new Vector());
		if (e.getActionCommand().equals("删除列")) {
			int columncount = defaultModel.getColumnCount() - 1;
			if (columncount >= 0)// 若columncount<0代表已经没有任何列了。
			{
				TableColumnModel columnModel = table.getColumnModel();
				TableColumn tableColumn = columnModel.getColumn(columncount);
				columnModel.removeColumn(tableColumn);
				defaultModel.setColumnCount(columncount);
			}
		}
		if (e.getActionCommand().equals("删除行")) {
			int rowcount = defaultModel.getRowCount() - 1;// getRowCount返回行数,rowcount<0代表已经没有任何行了。
			if (rowcount >= 0) {
				defaultModel.removeRow(rowcount);
				defaultModel.setRowCount(rowcount);// 删除行比较简单,只要用DefaultTableModel的removeRow()方法即可。删除
				// 行完毕后必须重新设置列数,也就是使用DefaultTableModel的setRowCount()方法来设置。
			}
		}
		table.revalidate();
	}

	public static void main(String args[]) {
		new AddRemoveCells();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值