图解应用集成开发环境设计GUI程序-3
2013-02-03 17:49
417 查看
效果如下图:
程序代码清单如下:
程序分析:
在上面的FrameTableDemo类中,通过自定义一个内部类MyTableModel来定义表格数据,MyTableModel类继承AbstractTableModel类,并重写了AbstractTableModel类中的getColumnCount、getRowCount、getColumnName、getValueAt方法。
一个表格通常由两部分构成,一部分为表头显示的标题数据,另一部分为每一行显示的数据。表头数据需要放在一个一维的字符串数组中,定义表头的方法为:
而表格中的行数据实一个任意类型的二维数组,例如在上面的程序中,定义表格的行数据的方法为:
AbstractTableModel类中主要的方法有:
1,获得表格中列数的方法getColumnCount() 该方法一般需要重写,它返回表格中的列数,即上面程序中下定义的columnNames的长度。
2,获得表格中行数的方法getRowCount() 该方法一般也需要重写,它返回表格中的行数,即上面程序中下定义的data的长度。
3,获得表格中某列名字的方法getColumnName(int col) 该方法根据传入的列号返回对应表格头的列名,即上面程序中下定义的columnNames中的值,一般也需要重写。
4,获得某行某列数据的方法getValueAt(int row,int col) 该方法根据传入的行号好列号返回对应的值,即上面程序中下定义的data中的值,一般也需要重写。
5,设置表格的某行某列数据是否可编辑的方法isCellEditable(int row,int col) 如果该方法返回的值是true,则表明相对应的表格数据是可编辑的,否则是不可编辑的。
6,改变表格中某行某列数据值的方法 setValueAt(Object value, int row, int col) 通过该方法可以更改表格中相对应的值,即上面程序中下定义的data中的值,一般也需要重写。
当创建问完AbstractTableModel的子类后,可以直接用它来创建表格,创建表格的方法为:
创建完表后,需要把表格放在JScollPane面板中显示,实现代码为:
可以通过TableColumnModel对象来设置表中没列的列宽,TableColumnModel对象的获取和设置列宽的方法为:
程序代码清单如下:
package com.javaapp.ch12; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; @SuppressWarnings("serial") public class FrameTableDemo extends JFrame { private boolean DEBUG = true; @SuppressWarnings("static-access") public FrameTableDemo() { // 实现构造方法 super("计应14职位表"); // 首先调用父类JFrame的构造方法生成一个窗口 MyTableModel myModel = new MyTableModel(); // myModel存放表格的数据 JTable table = new JTable(myModel); // 表格对象table的数据来源是myModel对象 table.setPreferredScrollableViewportSize(new Dimension(400,100)); // 表格的显示尺寸 table.setAutoResizeMode(table.AUTO_RESIZE_OFF);// 设置自动横向滚动 TableColumnModel md7 = (TableColumnModel) table.getColumnModel(); md7.getColumn(0).setMinWidth(30);// 设置列的宽度 md7.getColumn(1).setMaxWidth(50); md7.getColumn(2).setMaxWidth(60); JScrollPane scrollPane = new JScrollPane(table);// 产生一个带滚动条的面板 table.setRowMargin(2);//设置表格线的宽度 table.setRowHeight(40);//设置行的高度 getContentPane().add(scrollPane,BorderLayout.CENTER); // 将带滚动条的面板添加入窗口中 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e)// 注册窗口监听器 { System.exit(0); } }); } // 把要显示在表格中的数据存入字符串数组和Object数组中 class MyTableModel extends AbstractTableModel { // 表格中第一行所要显示的内容存放在字符串数组columnNames中 final String[] columnNames = { "像片","姓名","职位","电话","工资","婚否" }; // 表格中各行的内容保存在二维数组data中 ImageIcon apple = createImageIcon("4.jpg","天峰像片");//图片放在与本类同一目录中 ImageIcon anther = createImageIcon("5.jpg","其它像片"); ImageIcon apple1 = createImageIcon("6.jpg","天峰像片"); ImageIcon anther2 = createImageIcon("7.jpg","其它像片"); final Object[][] data = { { apple,"天峰","自由作家","02988225560",new Integer(20), new Boolean(false) }, { anther,"娜娜","总经理秘书","01068939397",new Integer(5000), new Boolean(true) }, { apple1,"沙沙","CEO","02983079137",new Integer(5500), new Boolean(false) }, { anther2,"杨深刚","科长","0296887678",new Integer(6000), new Boolean(true) }, { apple1,"李少恒","财务科长 ","02933541290",new Integer(4000), new Boolean(false) } }; // 下述方法是重写AbstractTableModel中的方法,其主要用途是被JTable对象调用,以便在表格中正确的显示出来。程序员必须根据采用的数据类型加以恰当实现。 // 获得列的数目 public int getColumnCount() { return columnNames.length; } // 获得行的数目 public int getRowCount() { return data.length; } // 获得某列的名字,而目前各列的名字保存在字符串数组columnNames中 public String getColumnName(int col) { return columnNames[col]; } // 获得某行某列的数据,而数据保存在对象数组data中 public Object getValueAt(int row,int col) { return data[row][col]; } // 判断每个单元格的类型 public Class getColumnClass(int c) { return getValueAt(0,c).getClass(); } // 将表格声明为可编辑的 public boolean isCellEditable(int row,int col) { if (col < 2) { return false; } else { return true; } } // 改变某个数据的值 public void setValueAt(Object value,int row,int col) { if (DEBUG) { System.out.println("设置值在 " + row + ", " + col + " to " + value + " (an instance of " + value.getClass() + ")"); } if (data[0][col] instanceof Integer && !(value instanceof Integer)) { try { data[row][col] = new Integer(value.toString()); fireTableCellUpdated(row,col); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(FrameTableDemo.this,"The \"" + getColumnName(col) + "\" 列只接受整型数据."); } } else { data[row][col] = value; fireTableCellUpdated(row,col); } if (DEBUG) { System.out.println("数据的最新改变值:"); printDebugData(); } } public ImageIcon createImageIcon(String filename,String description) { String path = filename; return new ImageIcon(getClass().getResource(path),description); } private void printDebugData() { int numRows = getRowCount(); int numCols = getColumnCount(); for (int i = 0; i < numRows; i++) { System.out.print(" row " + i + ":"); for (int j = 0; j < numCols; j++) { System.out.print(" " + data[i][j]); } System.out.println(); } System.out.println("--------------------------"); } } public static void main(String[] args) { FrameTableDemo frame = new FrameTableDemo(); frame.pack(); frame.setVisible(true); } }
程序分析:
在上面的FrameTableDemo类中,通过自定义一个内部类MyTableModel来定义表格数据,MyTableModel类继承AbstractTableModel类,并重写了AbstractTableModel类中的getColumnCount、getRowCount、getColumnName、getValueAt方法。
一个表格通常由两部分构成,一部分为表头显示的标题数据,另一部分为每一行显示的数据。表头数据需要放在一个一维的字符串数组中,定义表头的方法为:
fianl String[] columnName={"像片","姓名","职位","电话","工资","婚否"};
而表格中的行数据实一个任意类型的二维数组,例如在上面的程序中,定义表格的行数据的方法为:
fianl Object[][] data={ {apple,"天峰","自由作家","02988225560",new Integer(20),new Boolean(false)}};
AbstractTableModel类中主要的方法有:
1,获得表格中列数的方法getColumnCount() 该方法一般需要重写,它返回表格中的列数,即上面程序中下定义的columnNames的长度。
2,获得表格中行数的方法getRowCount() 该方法一般也需要重写,它返回表格中的行数,即上面程序中下定义的data的长度。
3,获得表格中某列名字的方法getColumnName(int col) 该方法根据传入的列号返回对应表格头的列名,即上面程序中下定义的columnNames中的值,一般也需要重写。
4,获得某行某列数据的方法getValueAt(int row,int col) 该方法根据传入的行号好列号返回对应的值,即上面程序中下定义的data中的值,一般也需要重写。
5,设置表格的某行某列数据是否可编辑的方法isCellEditable(int row,int col) 如果该方法返回的值是true,则表明相对应的表格数据是可编辑的,否则是不可编辑的。
6,改变表格中某行某列数据值的方法 setValueAt(Object value, int row, int col) 通过该方法可以更改表格中相对应的值,即上面程序中下定义的data中的值,一般也需要重写。
当创建问完AbstractTableModel的子类后,可以直接用它来创建表格,创建表格的方法为:
MyTableModel myModel=enw MyTableModel; //myModel存放表格的数据 Jtable table=new JTable(myModel); //表格对象data的数据来源是myModel对象
创建完表后,需要把表格放在JScollPane面板中显示,实现代码为:
JScrollPane scrollPane=new JScrollpane(table); //产生一个带滚动条的面板 table.setAutoResizeMode(table.AUTO_RESIZE_OFF); //设置自动横向滚动
可以通过TableColumnModel对象来设置表中没列的列宽,TableColumnModel对象的获取和设置列宽的方法为:
TableColumnModel mf7=(TableColumnModel)table.getColumnModel(); md7.getColumn(0).setMinWidth(30); //设置列宽
相关文章推荐
- 图解应用集成开发环境设计GUI程序-1
- 图解应用集成开发环境设计GUI程序-2
- 图解应用集成开发环境设计GUI程序-4
- Android应用集成开发环境,强烈推荐使用
- 图解Windows下开发Objective-C程序之一 - 搭建Objective-C开发环境
- Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助。 1、Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境。 是什么因素使一个程序成为Co
- 01_Android应用开发环境_03_开发环境搭建及简单Android程序
- 教你将电脑的所有背景色全调成养眼的豆沙绿(IE,word,pdf,所有程序集成开发环境)
- android应用开发-从设计到实现 4-2 开发环境搭建
- 【嵌入式linux】(第六步):使用eclipse集成开发环境开发第一个嵌入式Linux程序,并测试LED驱动
- Linux程序应用开发环境和工具经验谈
- 亲密接触Java手机程序设计(二):配置手机程序开发环境――WTK
- Eclipe集成环境开发HBase程序过程详解
- 01_Android应用开发环境搭建【图解】
- Linux程序应用开发环境和工具经验谈
- 用Eclipse和wxpython搭建一个Python Gui程序开发环境
- Python 2.7 GUI 编程集成开发环境的搭建 Python 2.7 + PyQt 4 + Eric 6 环境搭建
- 片上系统(SOC)设计流程及其集成开发环境
- 用eclipse集成开发环境开发、调试arm linux程序
- linux平台下的集成开发环境、RAD工具和GUI-builder