JTable组件
JTable组件用于显示二维表格对象。
目录
使用设计模式创建
添加面板
添加JTable
把列表JTable嵌到JScrollPane:必须要把JTable控件拖入JScrollPane的Viewport区域中才能显示,拖入的区域如下图中的黄色区域所示:
设置表头标题
点击左侧控件列表中的JTable控件。
在属性列表中找到【model】,点击【…】打开表格编辑框:
图 8 表格编辑对话框
点击【Columns】区域的【Insert】插入一列, 在底部的列属性区域中设置【Title】为:作弊,设置列宽【Pref.width】为:103
按照以上步骤,依次添加如下表头信息:
列名:总分,列宽:103 列名:数学,列宽:103 列名:语文,列宽:103 列名:姓名,列宽:103
添加具体数据
运行结果
使用代码模式创建
开发原始代码
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程序设计