查看“JTable组件”的源代码
←
JTable组件
跳转至:
导航
,
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
JTable组件用于显示二维表格对象。 ==使用设计模式创建== ===添加面板=== [[文件:java2020-12-18.png|600px]] ===添加JTable=== 把列表JTable嵌到JScrollPane:必须要把JTable控件拖入JScrollPane的Viewport区域中才能显示,拖入的区域如下图中的黄色区域所示: [[文件:java2020-12-19.png|600px]] ===设置表头标题=== 点击左侧控件列表中的JTable控件。 [[文件:java2020-12-20.png]] 在属性列表中找到【model】,点击【…】打开表格编辑框: [[文件:java2020-12-22.png]] 图 8 表格编辑对话框 点击【Columns】区域的【Insert】插入一列, 在底部的列属性区域中设置【Title】为:作弊,设置列宽【Pref.width】为:103 按照以上步骤,依次添加如下表头信息: <nowiki>列名:总分,列宽:103 列名:数学,列宽:103 列名:语文,列宽:103 列名:姓名,列宽:103</nowiki> ===添加具体数据=== [[文件:java2020-12-23.png|700px]] ===运行结果=== [[文件:java2020-12-24.png|700px]] ==使用代码模式创建== ===开发原始代码=== <nowiki>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(); } }</nowiki> ===创建表格对象=== 创建一个JTable对象需要指明表格的数据和列标题: JTable table = new JTable(data, columnNames); 可以根据现有的数组和向量来创建JTable对象,Java SE提供了两种构造方法: JTable(Object[][] rowData,Object[][] columnNames):建立一个显示二维数组数据的表格,且可以显示列的名称。 JTable(Vector rowData,Vector columnNames):建立一个以Vector为输入来源的数据表格,可显示行的名称。 下面代码创建了一个学生成绩显示表格: <nowiki>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);</nowiki> ===添加对象到面板中=== 为了将表格中的列和数据显示出来,一种简单的方法是把JTable放在JScrollPane中,然后调用JTable.setFillsViewportHeight方法,设置此表是否始终大到足以填充封闭视口的高度。换句话说,此方法确保该表永远不会小于该视口: JScrollPane scrollPane = new JScrollPane(table); table.setFillsViewportHeight(true); ===添加面板到框架中=== this.add(scrollPane,BorderLayout.CENTER); ===完整代码=== 程序代码TableTest.java: <nowiki>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(); } }</nowiki> 程序运行结果如下图所示: ==使用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定义了表格中的数据对象 <nowiki>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]; } }</nowiki> ===使用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中: <nowiki>public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); }</nowiki> 运行程序,程序显示结果如下所示: ===表格更改事件=== 利用继承AbstractTableModel抽象类所产生的JTable的内容是不能被修改的.那如果想要让用户可以修改表格中的某一个字段,例如勾选Check Box或是直接修改某个字段的数字,需要重写 AbstractTableModel抽象类中的isCellEditable()方法和setValueAt()方法。下面代码是类Data中重写的这两种方法: <nowiki>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);//发出表格中某一字段已经更改的事件信息 }</nowiki> 【注意】value为我们所更改的值,我们将value存入p[row][col]中,并且调用firTableCellUpdated()方法来告诉系统表格已经做了更改。 ===表格事件处理=== 在对表格内容的进行操作处理,包括字段内容改变,列数增加 或减少,行数增加或减少,或是表格的结构改变等,会触发TableModelEvent事件。要处理 TableModelEvent必须实现TableModelListener接口,此接口定义了一个方法,那就是tableChanged()方法。在AbstractTableModel类中提供了一个注册TableModelListener的方法 :addTableModelListener()。 下面程序实现了,当修改语文和数学成绩同时,修改总分: <nowiki>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(); } }</nowiki> 返回 [[Java程序设计]]
返回至
JTable组件
。
导航菜单
个人工具
登录
命名空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
页面信息