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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章