Java - Swing用户界面设计(6)

 

2.3.19 表格(JTable) 

  表格是Swing新增加的组件,主要功能是把数据以二维表格的形式显示出来。使用表格,依据M-V-C的思想,最好先生成一个MyTableModel 类型的对象来表示数据,这个类是从AbstractTableModel类中继承来的,其中有几个方法是一定要重写,例如getColumnCount, getRowCount,getColumnName,getValueAt。因为Jtable会从这个对象中自动获取表格显示所必需的数据, AbstractTableModel类的对象负责表格大小的确定(行、列)、内容的填写、赋值、表格单元更新的检测等等一切跟表格内容有关的属性及其操作。JTable类生成的对象以该TableModel为参数,并负责将TableModel对象中的数据以表格的形式显示出来。

    JTable类常用的方法有: 

   getModel() //获得表格的数据来源对象 

  JTable(TableModel dm) //dm对象中包含了表格要显示的数据 

  //下列两个构造方法,第一个参数是数据,第二个参数是表格第一行中显示的内容 

   JTable(object[][]rowData,object[]columnNams);

   JTable(Vector[][]rowData,Vector[]columnNams); 

 例3 RecorderOfWorkers 

  1. import javax.swing.JFrame;
  2.    public class TableDemo extends JFrame { 
  3.          private boolean DEBUG = true;  
  4.           public TableDemo() { //实现构造方法 
  5.                super("RecorderOfWorkers"); //首先调用父类JFrame的构造方法生成一个窗口 
  6.                MyTableModel myModel = new MyTableModel();//myModel存放表格的数据  
  7.                 JTable table = new JTable(myModel);//表格对象table的数据来源是myModel对象 
  8.                table.setPreferredScrollableViewportSize(new Dimension(500, 70));//表格的显示尺寸
  9.                //产生一个带滚动条的面板 
  10.                JScrollPane scrollPane = new JScrollPane(table);
  11.                //将带滚动条的面板添加入窗口中  
  12.                 getContentPane().add(scrollPane, BorderLayout.CENTER);
  13.                addWindowListener(new WindowAdapter() {//注册窗口监听器
  14.                      public void windowClosing(WindowEvent e) {
  15.                            System.exit(0); 
  16.                          }
  17.                        });
  18.                    }    
  19.           //把要显示在表格中的数据存入字符串数组和Object数组中 
  20.                  
  21.                       class MyTableModel extends AbstractTableModel {  
  22.                              //表格中第一行所要显示的内容存放在字符串数组columnNames中 
  23.                      
  24.                                  final String[] columnNames = {"First Name"
  25.                                                                    "Position", 
  26.                                                                    "Telephone",    
  27.                                                        "MonthlyPay",  
  28.                                                                "Married"};  
  29.              //表格中各行的内容保存在二维数组data中    
  30.             final Object[][] data = { 
  31.                      {"Wangdong""Executive",  "01068790231"new Integer(5000), new Boolean(false)},
  32.                        {"LiHong""Secretary",   "01069785321"new Integer(3500), new Boolean(true)}, 
  33.                        {"LiRui""Manager",    "01065498732"new Integer(4500), new Boolean(false)}, 
  34.                        {"ZhaoXin""Safeguard",   "01062796879"new Integer(2000), new Boolean(true)},  
  35.                        {"ChenLei""Salesman",  "01063541298"new Integer(4000), new Boolean(false)} 
  36.                    };  
  37.                   //下述方法是重写AbstractTableModel中的方法,其主要用途是被JTable对象调用,以便在表格中正确的显示出来。程序员必须根据采用的数据类型加以恰当实现。    
  38.               //获得列的数目  
  39.                public int getColumnCount() {    
  40.                    return columnNames.length; 
  41.                }  
  42.               //获得行的数目   
  43.               public int getRowCount() {     
  44.                   return data.length;
  45.                }     
  46.               //获得某列的名字,而目前各列的名字保存在字符串数组columnNames中   
  47.               public String getColumnName(int col) {     
  48.                   return columnNames[col]; 
  49.                }    
  50.             //获得某行某列的数据,而数据保存在对象数组data中     
  51.               public Object getValueAt(int row, int col) {    
  52.                    return data[row][col];
  53.                }    
  54.             //判断每个单元格的类型    
  55.              public Class getColumnClass(int c) {   
  56.                     return getValueAt(0, c).getClass();
  57.                }    
  58.             //将表格声明为可编辑的      
  59.               public boolean isCellEditable(int row, int col) {
  60.                       if (col < 2) {
  61.                             return false;
  62.                           } else {
  63.                                 return true;
  64.                               } 
  65.                            }  
  66.               //改变某个数据的值     
  67.              public void setValueAt(Object value, int row, int col) {
  68.                       if (DEBUG) {
  69.                             System.out.println("Setting value at " + row + ",
  70.                                   " + col 
  71.                                    + " to " + value 
  72.                                    + " (an instance of " 
  73.                                        + value.getClass() + ")"); 
  74.                           } 
  75.                           if (data[0][col] instanceof Integer
  76.                               && !(value instanceof Integer)) {
  77.                                try { 
  78.                                       data[row][col] = new Integer(value.toString()); 
  79.                                       fireTableCellUpdated(row, col);
  80.                                    } catch (NumberFormatException e) {
  81.                                           JOptionPane.showMessageDialog(TableDemo.this,
  82.                                            "The " + getColumnName(col) 
  83.                                            + " column accepts only integer values.");
  84.                                        }       } else { 
  85.                                            data[row][col] = value;
  86.                                            fireTableCellUpdated(row, col); 
  87.                                        }       
  88.                                      if (DEBUG) {
  89.                                                       System.out.println("New value of data:");
  90.                                                printDebugData(); 
  91.                                            }
  92.                                         }
  93.                                         private void printDebugData() {
  94.                                               int numRows = getRowCount();
  95.                                                int numCols = getColumnCount();
  96.                                                for (int i=0; i < numRows; i++) {
  97.                                                      System.out.print(" row " + i + ":");
  98.                                                      for (int j=0; j < numCols; j++) {
  99.                                                            System.out.print(" " + data[i][j]);
  100.                                                          }
  101.                                                          System.out.println(); 
  102.                                                        } 
  103.                                                        System.out.println("--------------------------"); 
  104.                                                     }
  105.                                                    }
  106.                                                    public static void main(String[] args) {
  107.                                                         TableDemo frame = new TableDemo();
  108.                                                         frame.pack(); 
  109.                                                         frame.setVisible(true);
  110.                                                        }
  111.                                                       } 
  112.                }
  113.         }
  114.    }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值