Swing编程(八)JTable表格 二

和JList,JTree类似,JTable采用TableModel来保存表格中的所有状态数据,采用TableColumnModel来保存所有列的数据。eg[java]view plaincopy

  1. publicclass TestDefaultTableModel  

  2. {  

  3.    JFrame mainWin = new JFrame("管理数据行、数据列");  

  4. finalint COLUMN_COUNT = 5;  

  5.    DefaultTableModel model;  

  6.    JTable table;  

  7. //用于保存被隐藏列的List集合

  8.    ArrayList<TableColumn> hiddenColumns = new ArrayList<TableColumn>();  

  9. publicvoid init()  

  10.    {  

  11.        model = new DefaultTableModel(COLUMN_COUNT ,COLUMN_COUNT);  

  12. for (int i = 0; i < COLUMN_COUNT ; i++ )  

  13.        {  

  14. for (int j = 0; j < COLUMN_COUNT ; j++ )  

  15.            {  

  16.                model.setValueAt("老单元格值 " + i + " " + j , i , j);  

  17.            }  

  18.        }  

  19.        table = new JTable(model);  

  20.        mainWin.add(new JScrollPane(table), BorderLayout.CENTER);  

  21. //为窗口安装菜单

  22.        JMenuBar menuBar = new JMenuBar();  

  23.        mainWin.setJMenuBar(menuBar);  

  24.        JMenu tableMenu = new JMenu("管理");  

  25.        menuBar.add(tableMenu);  

  26.        JMenuItem hideColumnsItem = new JMenuItem("隐藏选中列");  

  27.        hideColumnsItem.addActionListener(new ActionListener()  

  28.        {  

  29. publicvoid actionPerformed(ActionEvent event)  

  30.            {  

  31. //获取所有选中列的索引

  32. int[] selected = table.getSelectedColumns();  

  33.                TableColumnModel columnModel = table.getColumnModel();  

  34. //依次把每一个选中的列隐藏起来,并使用List把这些列保存起来

  35. for (int i = selected.length - 1; i >= 0; i--)  

  36.                {  

  37.                    TableColumn column = columnModel.getColumn(selected[i]);  

  38.                    table.removeColumn(column);  

  39. //把隐藏的列保存起来,确保以后可以显示出来

  40.                    hiddenColumns.add(column);  

  41.                }  

  42.            }  

  43.        });  

  44.        tableMenu.add(hideColumnsItem);  

  45.        JMenuItem showColumnsItem = new JMenuItem("显示隐藏列");  

  46.        showColumnsItem.addActionListener(new ActionListener()  

  47.        {  

  48. publicvoid actionPerformed(ActionEvent event)  

  49.            {  

  50. //把所有隐藏列依次显示出来

  51. for (TableColumn tc : hiddenColumns)  

  52.                {  

  53. //依次把所有隐藏的列显示出来

  54.                    table.addColumn(tc);  

  55.                }  

  56. //清空保存隐藏列的List集合

  57.                hiddenColumns.clear();              

  58.            }  

  59.        });  

  60.        tableMenu.add(showColumnsItem);  

  61.        JMenuItem addColumnItem = new JMenuItem("插入选中列");  

  62.        addColumnItem.addActionListener(new ActionListener()  

  63.        {  

  64. publicvoid actionPerformed(ActionEvent event)  

  65.            {  

  66. //获取所有选中列的索引

  67. int[] selected = table.getSelectedColumns();  

  68.                TableColumnModel columnModel = table.getColumnModel();  

  69. //依次把选中的列添加到JTable之后

  70. for (int i = selected.length - 1; i >= 0; i--)  

  71.                {    

  72.                    TableColumn column = columnModel.getColumn(selected[i]);  

  73.                    table.addColumn(column);  

  74.                }  

  75.            }  

  76.        });  

  77.        tableMenu.add(addColumnItem);  

  78.        JMenuItem addRowItem = new JMenuItem("增加行");  

  79.        addRowItem.addActionListener(new ActionListener()  

  80.        {  

  81. publicvoid actionPerformed(ActionEvent event)  

  82.            {  

  83. //创建一个String数组作为新增行的内容

  84.                String[] newCells = new String[COLUMN_COUNT];  

  85. for (int i = 0; i < newCells.length; i++)  

  86.                {  

  87.                    newCells[i] = "新单元格值 " + model.getRowCount() + " " + i;  

  88.                }  

  89. //向TableModel中新增一行。

  90.                model.addRow(newCells);  

  91.            }  

  92.        });  

  93.        tableMenu.add(addRowItem);  

  94.        JMenuItem removeRowsItem = new  JMenuItem("删除选中行");  

  95.        removeRowsItem.addActionListener(new ActionListener()  

  96.        {  

  97. publicvoid actionPerformed(ActionEvent event)  

  98.            {  

  99. //获取所有选中行

  100. int[] selected = table.getSelectedRows();  

  101. //依次删除所有选中行

  102. for (int i = selected.length - 1; i >= 0; i--)  

  103.                {  

  104.                    model.removeRow(selected[i]);  

  105.                }  

  106.            }  

  107.        });  

  108.        tableMenu.add(removeRowsItem);  

  109.        mainWin.pack();  

  110.        mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

  111.        mainWin.setVisible(true);  

  112.    }  

  113. publicstaticvoid main(String[] args)  

  114.    {  

  115. new TestDefaultTableModel().init();  

  116.    }  

  117. }  

但要注意列的增加,只是将原来隐藏的列显示,而不是真正增加列,你要新增的话那就重新new个JTable

前面讲的表格,单元格都是字符串,这是由于我们传入的都是DefaultTableModel它最终调用toString方法来绘制表格,具体自定义单元格的方法如下,eg[java]view plaincopy

  1. publicclass TestTableCellRenderer  

  2. {  

  3.    JFrame jf = new JFrame("使用单元格绘制器");  

  4.    JTable table;  

  5. //定义二维数组作为表格数据

  6.    Object[][] tableData =  

  7.    {  

  8. new Object[]{"李清照" , 29 , "女" , new ImageIcon("icon/3.gif") , true},  

  9. new Object[]{"苏格拉底", 56 , "男" , new ImageIcon("icon/1.gif") , false},  

  10. new Object[]{"李白", 35 , "男" , new ImageIcon("icon/4.gif")  , true},  

  11. new Object[]{"弄玉", 18 , "女" , new ImageIcon("icon/2.gif")  , true},  

  12. new Object[]{"虎头" , 2 , "男" , new ImageIcon("icon/5.gif") , true}  

  13.    };  

  14. //定义一维数据作为列标题

  15.    String[] columnTitle = {"姓名" , "年龄" , "性别" , "主头像" , "是否中国人"};  

  16. publicvoid init()  

  17.    {  

  18. //以二维数组和一维数组来创建一个ExtendedTableModel对象

  19.        ExtendedTableModel model = new ExtendedTableModel(columnTitle , tableData);  

  20. //以ExtendedTableModel来创建JTable

  21.        table = new JTable( model);  

  22.        table.setRowSelectionAllowed(false);  

  23.        table.setRowHeight(40);  

  24. //获取第三列

  25.        TableColumn lastColumn = table.getColumnModel().getColumn(2);  

  26. //对第三列采用自定义的单元格绘制器

  27.        lastColumn.setCellRenderer(new GenderTableCellRenderer());  

  28. //将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来

  29.        jf.add(new JScrollPane(table));  

  30.        jf.pack();  

  31.        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

  32.        jf.setVisible(true);  

  33.    }  

  34. publicstaticvoid main(String[] args)  

  35.    {  

  36. new TestTableCellRenderer().init();  

  37.    }  

  38. }  

  39. class ExtendedTableModel extends DefaultTableModel  

  40. {  

  41. //重新提供一个构造器,该构造器的实现委托给DefaultTableModel父类

  42. public ExtendedTableModel(String[] columnNames , Object[][] cells)  

  43.    {  

  44. super(cells , columnNames);  

  45.    }  

  46. //重写getColumnClass方法,根据每列的第一个值来返回其真实的数据类型

  47. public Class getColumnClass(int c)  

  48.    {  

  49. return getValueAt(0 , c).getClass();  

  50.    }  

  51. }  

  52. class GenderTableCellRenderer extends JPanel implements TableCellRenderer  

  53. {  

  54. private String cellValue;  

  55. //定义图标的宽度和高度

  56. finalint ICON_WIDTH = 23;  

  57. finalint ICON_HEIGHT = 21;  

  58. public Component getTableCellRendererComponent(JTable table, Object value,  

  59. boolean isSelected, boolean hasFocus, int row, int column)  

  60.    {  

  61.        cellValue = (String)value;  

  62. //设置选中状态下绘制边框

  63. if (hasFocus)  

  64.        {  

  65.            setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));  

  66.        }  

  67. else

  68.        {  

  69.            setBorder(null);  

  70.        }  

  71. returnthis;  

  72.    }  

  73. //重写paint方法,负责绘制该单元格内容

  74. publicvoid paint(Graphics g)  

  75.    {  

  76. //如果表格值为"男"或"male",则绘制一个男性图标

  77. if (cellValue.equalsIgnoreCase("男")  

  78.            || cellValue.equalsIgnoreCase("male"))  

  79.        {  

  80.            drawImage(g , new ImageIcon("icon/male.gif").getImage());  

  81.        }  

  82. //如果表格值为"女"或"female",则绘制一个女性图标

  83. if (cellValue.equalsIgnoreCase("女")  

  84.            || cellValue.equalsIgnoreCase("female"))  

  85.        {  

  86.            drawImage(g , new ImageIcon("icon/female.gif").getImage());  

  87.        }  

  88.    }  

  89. //绘制图标的方法

  90. privatevoid drawImage(Graphics g , Image image)  

  91.    {  

  92.        g.drawImage(image, (getWidth() - ICON_WIDTH ) / 2

  93.            , (getHeight() - ICON_HEIGHT) / 2 , null);  

  94.    }  

  95. }  

原创地址:http://blog.csdn.net/terryzero/article/details/3838423

你可能感兴趣的:(java,swing,jtable)