JTable组件

来自CloudWiki
跳转至: 导航搜索

JTable组件用于显示二维表格对象。


使用设计模式创建

添加面板

Java2020-12-18.png

添加JTable

把列表JTable嵌到JScrollPane:必须要把JTable控件拖入JScrollPane的Viewport区域中才能显示,拖入的区域如下图中的黄色区域所示:

Java2020-12-19.png

设置表头标题

点击左侧控件列表中的JTable控件。

Java2020-12-20.png

在属性列表中找到【model】,点击【…】打开表格编辑框:

Java2020-12-22.png

图 8 表格编辑对话框


点击【Columns】区域的【Insert】插入一列, 在底部的列属性区域中设置【Title】为:作弊,设置列宽【Pref.width】为:103

按照以上步骤,依次添加如下表头信息:

列名:总分,列宽:103
列名:数学,列宽:103
列名:语文,列宽:103
列名:姓名,列宽:103

添加具体数据

Java2020-12-23.png

运行结果

Java2020-12-24.png

使用代码模式创建

开发原始代码

public class TableTest1 extends JFrame {
	
	public TableTest1() {
                super("简单表格示例");
                this.setLayout(new BorderLayout());
		
		this.setSize(270, 150);
		this.setTitle("简单表格示例");
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		TableTest1 test=new TableTest1();
	}
}

创建表格对象

创建一个JTable对象需要指明表格的数据和列标题:

JTable table = new JTable(data, columnNames);

可以根据现有的数组和向量来创建JTable对象,Java SE提供了两种构造方法:

JTable(Object[][] rowData,Object[][] columnNames):建立一个显示二维数组数据的表格,且可以显示列的名称。
JTable(Vector rowData,Vector columnNames):建立一个以Vector为输入来源的数据表格,可显示行的名称。

下面代码创建了一个学生成绩显示表格:

String[] names = { "姓名", "语文", "数学", "总分", "作弊" };
 Object[][] scores = { { "张三", new Integer(66), new Integer(32), new Integer(98), new Boolean(false) },
				{ "李四", new Integer(82), new Integer(69), new Integer(128), new Boolean(true) }, };
 JTable table=new JTable(scores,names);

添加对象到面板中

为了将表格中的列和数据显示出来,一种简单的方法是把JTable放在JScrollPane中,然后调用JTable.setFillsViewportHeight方法,设置此表是否始终大到足以填充封闭视口的高度。换句话说,此方法确保该表永远不会小于该视口:

JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);

添加面板到框架中

this.add(scrollPane,BorderLayout.CENTER);

完整代码

程序代码TableTest.java:

public class TableTest1 extends JFrame {
	
	public TableTest1() {
                super("简单表格示例");
                this.setLayout(new BorderLayout());

		String[] names = { "姓名", "语文", "数学", "总分", "作弊" };
		Object[][] scores = { { "张三", new Integer(66), new Integer(32), new Integer(98), new Boolean(false) },
				{ "李四", new Integer(82), new Integer(69), new Integer(128), new Boolean(true) }, };
		JTable table=new JTable(scores,names);//创建表格对象
		
		JScrollPane scrollPane = new JScrollPane(table);//将表格添加到(滚动)面板中
		table.setFillsViewportHeight(true);
		this.add(scrollPane,BorderLayout.CENTER);
		this.setSize(270, 150);
		this.setTitle("简单表格示例");
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		TableTest1 test=new TableTest1();
	}
}

程序运行结果如下图所示:

使用TableModel创建JTable

JTable对象使用TableModel对象管理表格中的数据,如果程序中没有创建TabelModel对象,JTable会自动创建一个默认的TableModel对象,关系如下图所示


TableModel本身是一个interface,在这个interface里面定义了若干的方法:包括了存取表格字段(cell)的内容、计算表格的列数等等 的基本存取操作,让设计者可以简单地利用TableModel来实作他所想要的表格。

在实际应用中,没有必要直接实现TableModel接口,可以充分利用AbstractTableModel类,它实现了大部分必须的方法。仅仅需要继承该类,并重写下面三种方法:

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row,int column);

例如,类Data定义了表格中的数据对象

class Data extends AbstractTableModel{
	String[] names = { "姓名", "语文", "数学", "总分", "作弊" };
	Object[][] scores = { { "张三", 66, 32, 98, false },
			{ "李四", 82, 69, 128, true } };
	@Override
	public int getColumnCount() {
		return names.length;
	}

	@Override
	public int getRowCount() {
		return scores.length;
	}

	@Override
	public Object getValueAt(int row, int column) {
		return scores[row][column];
	}
	
	public String getColumnName(int col) {
		return names[col];
	}
}

使用TableModel创建JTable

可以使用构造方法JTable(TableModel dm)建立一个JTable,如下面代码所示:

TableModel model=new Data();
JTable table=new JTable(model);

添加对象到面板中

JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
this.add(scrollPane,BorderLayout.CENTER);

表格修改

更改数据显示外观

在展示数据的时候,JTable类可以根据TableModel中数据类型选取合适的描绘器,这是通过定义下面方法实现的:

Class<?> getColumnClass(int columnIndex)

把下面代码添加到类Data中:

public Class getColumnClass(int c) {
		return getValueAt(0, c).getClass();
}

运行程序,程序显示结果如下所示:

表格更改事件

利用继承AbstractTableModel抽象类所产生的JTable的内容是不能被修改的.那如果想要让用户可以修改表格中的某一个字段,例如勾选Check Box或是直接修改某个字段的数字,需要重写 AbstractTableModel抽象类中的isCellEditable()方法和setValueAt()方法。下面代码是类Data中重写的这两种方法:

public boolean isCellEditable(int rowIndex,int columnIndex){
	    if(columnIndex==3)
	    	return false;
		return true;
	}  
	public void setValueAt(Object value,int row,int col){
	     scores[row][col]=value;
	     fireTableCellUpdated(row,col);//发出表格中某一字段已经更改的事件信息
	}

【注意】value为我们所更改的值,我们将value存入p[row][col]中,并且调用firTableCellUpdated()方法来告诉系统表格已经做了更改。

表格事件处理

在对表格内容的进行操作处理,包括字段内容改变,列数增加 或减少,行数增加或减少,或是表格的结构改变等,会触发TableModelEvent事件。要处理 TableModelEvent必须实现TableModelListener接口,此接口定义了一个方法,那就是tableChanged()方法。在AbstractTableModel类中提供了一个注册TableModelListener的方法 :addTableModelListener()。 下面程序实现了,当修改语文和数学成绩同时,修改总分:

package main;

import java.awt.BorderLayout;

import javax.swing.*;
import javax.swing.table.TableModel;

public class TableTest2 extends JFrame {
	
	public TableTest2() {
		
		TableModel model = new Data();
		model.addTableModelListener(e -> {
			int row = e.getFirstRow();
			int column = e.getColumn();
			if (column == 1 || column == 2) {
				int yuwen = (int) model.getValueAt(row, 1);// 获得语文成绩
				int math = (int) model.getValueAt(row, 2);// 获得数学成绩
				model.setValueAt((yuwen + math), row, 3);
			}
		});
		
		
		JTable table=new JTable(model);		
		JScrollPane scrollPane = new JScrollPane(table);
		table.setFillsViewportHeight(true);
		
		table.setFillsViewportHeight(true);
		this.add(scrollPane,BorderLayout.CENTER);
		this.setSize(270, 150);
		this.setTitle("简单表格示例");
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		TableTest2 test=new TableTest2();
	}
}

返回 Java程序设计