JTable 将数据存储和处理的任务委托给它的表格数据模型,表格数据模型必须实现TableModel接口,该接口定义许多方法,注册表格模型监听器,管理单元格以及获得行数,列数以及列名等。
AbstractTableModel 类 对 TableModel 接口中大部分方法提供部分实现,它关注监听器的管理,并为生成TableModeEvents 事件,以及把他们发送到监听器提供方便,要创建一个TableModel,可以简单扩展AbstractTableModel类并且至少实现下列三个方法
public int getRowCount()
public int getColumnCount()
public Object getValueAt(int row,int column)
DefaultTableModel 类 扩展 AbstractTableModel 类并实现这三个方法,此外DefaultTableModel 提供数据的具体存储,数据存在向量里,向量的元素是对象数组,每个元素代表一个独立单元格的值。
对表格内的数据动态添加删除用DefaultTableModel类方法实现
DefaultTableModel tableModel = new DefaultTableModel(.....);
tableModel.addRow(...);
tableModel.insertRow(...);
tableModel.removeRow(1);
tableModel.addColumn("columnName");
tableModel.setValueAt(value,int row,int column);
表格类型TableModel 管理表格数据通过TableModel能添加和删除行,也能添加一列,但是,不能通过TableModel删除列,为了从JTable中删除列,必须使用表格列模型。
1. 表格列模型管理表格的列,能够用来选择添加,移动和删除表格的列
2. 表格列模型必须实现TableColumnModel接口
DefaultTableColumnModel 是实现TableColumnModel和PropertyChangeListener的一个具体类。
以下给出例子代码可以帮助理解:
例1:静态表格
import javax.swing.JTable;
import javax.swing.JApplet;
import javax.swing.JScrollPane;
public class TestTable extends JApplet
{
//create table column names
String[] columnNames = {"Country","Capital","Population in Millions","Democracy"};
//Create table data
Object[][] data= {
{"USA","Washington DC",280,true},
{"Canada","Ottawa",32,true},
{"United Kingdom","London",60,true},
{"Germany","Berlin",83,true},
{"France","Paris",60,true},
{"Norway","Oslo",4.5,true},
{"India","new Deli",1046,true}
};
//Create a table
JTable jtable1 = new JTable(data,columnNames);
public void init()
{
add(new JScrollPane(jtable1));
}
}
例2:表格模型
import java.awt.BorderLayout;
import javax.swing.JApplet;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
public class TestTableModel extends JApplet
{
//create table column names
String[] columnNames={"Country","Captial","Population in Millions","Democracy"};
//create table data
Object[][]data= {
{"USA","Washington DC",280,true},
{"Canada","Ottawa",32,true},
};
//create a TableModel
DefaultTableModel tableModel1 = new DefaultTableModel(data,columnNames);
//create a ColumnModel
DefaultTableColumnModel columnModel = new DefaultTableColumnModel();
//create a table
JTable jTable1 = new JTable(tableModel1);
public void init()
{
super.setLayout(new BorderLayout());
this.add(new JScrollPane(jTable1));
tableModel1.addRow(new Object[]{"France","Paris",60,true});
tableModel1.addRow(new Object[]{});
tableModel1.insertRow(0, new Object[]{"India" , "New Delhi" , 1046, true});
tableModel1.removeRow(1);
tableModel1.addColumn("Area");
tableModel1.setValueAt(10, 0, 4);
tableModel1.setValueAt(20,1,4);
tableModel1.setValueAt(30,2,4);
TableColumnModel columnModel=jTable1.getColumnModel();
columnModel.removeColumn(columnModel.getColumn(4));
int columnCount = tableModel1.getColumnCount();
int rowCount = tableModel1.getRowCount();
System.out.println("columnCount ="+columnCount);
System.out.println("rowCount = "+rowCount);
int x=0,y=0;
String value = (String)tableModel1.getValueAt(x, y);
System.out.println("value = "+ value+" , x="+x+" ,y="+y);
}
}
例3 :表格列模型
import javax.swing.JApplet;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.table.TableColumnModel;
import java.awt.BorderLayout;
public class TestTableColumnModel extends JApplet
{
//create table column names
String [] columnNames = {"Country","Capital","Population in Millions","Democracy"};
//create table data
Object [][] data={
{"USA","Washington DC",32,true},
{"Canada","Ottawa",32,true}
};
//create a table
JTable jt = new JTable(data,columnNames);
public void init()
{
setLayout(new BorderLayout());
add(new JScrollPane(jt));
TableColumnModel columnMode1 = jt.getColumnModel();
columnMode1.removeColumn(columnMode1.getColumn(3));
columnMode1.moveColumn(0, 1);
}
}