表格是GUI编程中使用较多,但也是最麻烦的一个控件之一。表格是用来显示二维数据,提供编辑,选择等功能。如果只是显示数据,这还是非常easy的,只要在JTable中传入二维数组或集合就可以了,eg[c-sharp]view plaincopy

  1. publicclass SimpleTable  

  2. {  

  3.    JFrame jf = new JFrame("简单表格");  

  4.    JTable table;  

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

  6.    Object[][] tableData =  

  7.    {  

  8. new Object[]{"李清照" , 29 , "女"},  

  9. new Object[]{"苏格拉底", 56 , "男"},  

  10. new Object[]{"李白", 35 , "男"},  

  11. new Object[]{"弄玉", 18 , "女"},  

  12. new Object[]{"虎头" , 2 , "男"}  

  13.    };  

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

  15.    Object[] columnTitle = {"姓名" , "年龄" , "性别"};  

  16. publicvoid init()  

  17.    {  

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

  19.        table = new JTable(tableData , columnTitle);  

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

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

  22.        jf.pack();  

  23.        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

  24.        jf.setVisible(true);  

  25.    }  

  26. publicstaticvoid main(String[] args)  

  27.    {  

  28. new SimpleTable().init();  

  29.    }  

  30. }  

下面举个JTable表格调整和选择方式的例子,eg[java]view plaincopy

  1. publicclass AdjustingWidth  

  2. {  

  3.    JFrame jf = new JFrame("调整表格列宽");  

  4.    JMenuBar menuBar = new JMenuBar();  

  5.    JMenu adjustModeMenu = new JMenu("调整方式");  

  6.    JMenu selectUnitMenu = new JMenu("选择单元");  

  7.    JMenu selectModeMenu = new JMenu("选择方式");  

  8. //定义5个单选框按钮,用以控制表格的宽度调整方式

  9.    JRadioButtonMenuItem[] adjustModesItem = new JRadioButtonMenuItem[5];  

  10. //定义3个单选框按钮,用以控制表格的选择方式

  11.    JRadioButtonMenuItem[] selectModesItem = new JRadioButtonMenuItem[3];  

  12.    JCheckBoxMenuItem rowsItem = new JCheckBoxMenuItem("选择行");  

  13.    JCheckBoxMenuItem columnsItem = new JCheckBoxMenuItem("选择列");  

  14.    JCheckBoxMenuItem cellsItem = new JCheckBoxMenuItem("选择单元格");  

  15.    ButtonGroup adjustBg = new ButtonGroup();  

  16.    ButtonGroup selectBg = new ButtonGroup();  

  17. //定义一个int类型的数组,用于保存表格所有的宽度调整方式

  18. int[] adjustModes = newint[]{  

  19.        JTable.AUTO_RESIZE_OFF,  

  20.        JTable.AUTO_RESIZE_NEXT_COLUMN,  

  21.        JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS,  

  22.        JTable.AUTO_RESIZE_LAST_COLUMN,  

  23.        JTable.AUTO_RESIZE_ALL_COLUMNS  

  24.    };  

  25. int[] selectModes = newint[]{  

  26.        ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ,  

  27.        ListSelectionModel.SINGLE_INTERVAL_SELECTION ,  

  28.        ListSelectionModel.SINGLE_SELECTION  

  29.    };  

  30.    JTable table;  

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

  32.    Object[][] tableData =  

  33.    {  

  34. new Object[]{"李清照" , 29 , "女"},  

  35. new Object[]{"苏格拉底", 56 , "男"},  

  36. new Object[]{"李白", 35 , "男"},  

  37. new Object[]{"弄玉", 18 , "女"},  

  38. new Object[]{"虎头" , 2 , "男"}  

  39.    };  

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

  41.    Object[] columnTitle = {"姓名" , "年龄" , "性别"};  

  42. publicvoid init()  

  43.    {  

  44. //以二维数组和一维数组来创建一个JTable对象

  45.        table = new JTable(tableData , columnTitle);  

  46. //-----------为窗口安装设置表格调整方式的菜单-----------

  47.        adjustModesItem[0] = new JRadioButtonMenuItem("只调整表格");  

  48.        adjustModesItem[1] = new JRadioButtonMenuItem("只调整下一列");  

  49.        adjustModesItem[2] = new JRadioButtonMenuItem("平均调整余下列");  

  50.        adjustModesItem[3] = new JRadioButtonMenuItem("只调整最后一列");  

  51.        adjustModesItem[4] = new JRadioButtonMenuItem("平均调整所有列");  

  52.        menuBar.add(adjustModeMenu);  

  53. for (int i = 0; i

  54.        {  

  55. //默认选中第三个菜单项,即对应表格默认的宽度调整方式

  56. if (i == 2)  

  57.            {  

  58.                adjustModesItem[i].setSelected(true);  

  59.            }  

  60.            adjustBg.add(adjustModesItem[i]);  

  61.            adjustModeMenu.add(adjustModesItem[i]);  

  62. finalint index = i;  

  63. //为设置调整方式的菜单项添加监听器

  64.            adjustModesItem[i].addActionListener(new ActionListener()  

  65.            {  

  66. publicvoid actionPerformed(ActionEvent evt)  

  67.                {  

  68. //如果当前菜单项处于选中状态,表格使用对应的调整方式

  69. if (adjustModesItem[index].isSelected())  

  70.                    {  

  71.                        table.setAutoResizeMode(adjustModes[index]);  

  72.                    }  

  73.                }  

  74.            });  

  75.        }  

  76. //-----------为窗口安装设置表格选择方式的菜单-----------

  77.        selectModesItem[0] = new JRadioButtonMenuItem("无限制");  

  78.        selectModesItem[1] = new JRadioButtonMenuItem("单独的连续区");  

  79.        selectModesItem[2] = new JRadioButtonMenuItem("单选");  

  80.        menuBar.add(selectModeMenu);  

  81. for (int i = 0; i

  82.        {  

  83. //默认选中第一个菜单项,即对应表格默认的选择方式

  84. if (i == 0)  

  85.            {  

  86.                selectModesItem[i].setSelected(true);  

  87.            }  

  88.            selectBg.add(selectModesItem[i]);  

  89.            selectModeMenu.add(selectModesItem[i]);  

  90. finalint index = i;  

  91. //为设置选择方式的菜单项添加监听器

  92.            selectModesItem[i].addActionListener(new ActionListener()  

  93.            {  

  94. publicvoid actionPerformed(ActionEvent evt)  

  95.                {  

  96. //如果当前菜单项处于选中状态,表格使用对应的选择方式

  97. if (selectModesItem[index].isSelected())  

  98.                    {  

  99.                        table.getSelectionModel().setSelectionMode(selectModes[index]);  

  100.                    }  

  101.                }  

  102.            });  

  103.        }  

  104.        menuBar.add(selectUnitMenu);  

  105. //-----------为窗口安装设置表格选择单元的菜单-----------

  106.        rowsItem.setSelected(table.getRowSelectionAllowed());  

  107.        columnsItem.setSelected(table.getColumnSelectionAllowed());  

  108.        cellsItem.setSelected(table.getCellSelectionEnabled());  

  109.        rowsItem.addActionListener(new ActionListener()  

  110.        {  

  111. publicvoid actionPerformed(ActionEvent event)  

  112.            {  

  113.                table.clearSelection();  

  114. //如果该菜单项处于选中状态,设置表格的选择单元是行

  115.                table.setRowSelectionAllowed(rowsItem.isSelected());  

  116. //如果选择行、选择列同时被选中,其实质是选择单元格

  117.                cellsItem.setSelected(table.getCellSelectionEnabled());  

  118.            }  

  119.        });  

  120.        selectUnitMenu.add(rowsItem);  

  121.        columnsItem.addActionListener(new ActionListener()  

  122.        {  

  123. publicvoid actionPerformed(ActionEvent event)  

  124.            {  

  125.                table.clearSelection();  

  126. //如果该菜单项处于选中状态,设置表格的选择单元是列

  127.                table.setColumnSelectionAllowed(columnsItem.isSelected());  

  128. //如果选择行、选择列同时被选中,其实质是选择单元格

  129.                cellsItem.setSelected(table.getCellSelectionEnabled());  

  130.            }  

  131.        });  

  132.        selectUnitMenu.add(columnsItem);  

  133.        cellsItem.addActionListener(new ActionListener()  

  134.        {  

  135. publicvoid actionPerformed(ActionEvent event)  

  136.            {  

  137.                table.clearSelection();  

  138. //如果该菜单项处于选中状态,设置表格的选择单元是单元格

  139.                table.setCellSelectionEnabled(cellsItem.isSelected());  

  140. //该选项的改变会同时影响选择行、选择列两个菜单

  141.                rowsItem.setSelected(table.getRowSelectionAllowed());  

  142.                columnsItem.setSelected(table.getColumnSelectionAllowed());  

  143.            }  

  144.        });  

  145.        selectUnitMenu.add(cellsItem);  

  146.        jf.setJMenuBar(menuBar);  

  147. //分别获取表格的三个表格列,并设置三列的最小宽度,最佳宽度和最大宽度

  148.        TableColumn nameColumn = table.getColumn(columnTitle[0]);  

  149.        nameColumn.setMinWidth(40);  

  150.        TableColumn ageColumn = table.getColumn(columnTitle[1]);  

  151.        ageColumn.setPreferredWidth(50);  

  152.        TableColumn genderColumn = table.getColumn(columnTitle[2]);  

  153.        genderColumn.setMaxWidth(50);  

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

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

  156.        System.out.println(table.getModel());  

  157.        jf.pack();  

  158.        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  

  159.        jf.setVisible(true);  

  160.    }  

  161. publicstaticvoid main(String[] args)  

  162.    {  

  163. new AdjustingWidth().init();  

  164.    }  

  165. }  



我这里只是实现了每列不同的控件,大家还可以自定义一个表格每行每列都是不同的控件,那就要得到单元格再setCellRender。

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