程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Swing編程:JTable表格

Java Swing編程:JTable表格

編輯:關於JAVA

表格是GUI編程中使用較多,但也是最麻煩的一個控件之一。表格是用來顯示二維數據,提供編輯,選擇等功能。如果只是顯示數據,這還是非常easy的,只要在JTable中傳入二維數組或集合就可以了,eg

  1. public class 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. public void 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. public static void main(String[] args)
  27. {
  28. new SimpleTable().init();
  29. }
  30. }

下面舉個JTable表格調整和選擇方式的例子,eg

  1. public class 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 = new int[]{
  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 = new int[]{
  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. public void 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 < adjustModesItem.length ; 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. final int index = i;
  63. //為設置調整方式的菜單項添加監聽器
  64. adjustModesItem[i].addActionListener(new ActionListener()
  65. {
  66. public void 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 < selectModesItem.length ; 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. final int index = i;
  91. //為設置選擇方式的菜單項添加監聽器
  92. selectModesItem[i].addActionListener(new ActionListener()
  93. {
  94. public void 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. public void 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. public void 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. public void 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. public static void main(String[] args)
  162. {
  163. new AdjustingWidth().init();
  164. }
  165. }

和JList,JTree類似,JTable采用TableModel來保存表格中的所有狀態數據,采用TableColumnModel來保存所有列的數據。eg

  1. public class TestDefaultTableModel
  2. {
  3. JFrame mainWin = new JFrame("管理數據行、數據列");
  4. final int COLUMN_COUNT = 5;
  5. DefaultTableModel model;
  6. JTable table;
  7. //用於保存被隱藏列的List集合
  8. ArrayList<TableColumn> hiddenColumns = new ArrayList<TableColumn>();
  9. public void 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. public void 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. public void 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. public void 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. public void 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. public void 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. public static void main(String[] args)
  114. {
  115. new TestDefaultTableModel().init();
  116. }
  117. }

但要注意列的增加,只是將原來隱藏的列顯示,而不是真正增加列,你要新增的話那就重新new個JTable

前面講的表格,單元格都是字符串,這是由於我們傳入的都是DefaultTableModel它最終調用toString方法來繪制表格,具體自定義單元格的方法如下,eg

  1. public class 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. public void 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. public static void 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. final int ICON_WIDTH = 23;
  57. final int 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. return this;
  72. }
  73. //重寫paint方法,負責繪制該單元格內容
  74. public void 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. private void drawImage(Graphics g , Image image)
  91. {
  92. g.drawImage(image, (getWidth() - ICON_WIDTH ) / 2
  93. , (getHeight() - ICON_HEIGHT) / 2 , null);
  94. }
  95. }

我這裡只是實現了每列不同的控件,大家還可以自定義一個表格每行每列都是不同的控件,那就要得到單元格再setCellRender。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved