表格是GUI编程中使用较多,但也是最麻烦的一个控件之一。表格是用来显示二维数据,提供编辑,选择等功能。如果只是显示数据,这还是非常easy的,只要在JTable中传入二维数组或集合就可以了,eg
- public class SimpleTable
- {
-
JFrame jf = new JFrame("简单表格");
- JTable table;
-
- Object[][] tableData =
- {
-
new Object[]{"李清照" , 29 , "女"},
-
new Object[]{"苏格拉底", 56 , "男"},
-
new Object[]{"李白", 35 , "男"},
-
new Object[]{"弄玉", 18 , "女"},
-
new Object[]{"虎头" , 2 , "男"}
- };
-
-
Object[] columnTitle = {"姓名" , "年龄" , "性别"};
-
public void init()
- {
-
-
table = new JTable(tableData , columnTitle);
-
-
jf.add(new JScrollPane(table));
- jf.pack();
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
jf.setVisible(true);
- }
-
public static void main(String[] args)
- {
-
new SimpleTable().init();
- }
- }
下面举个JTable表格调整和选择方式的例子,eg
- public class AdjustingWidth
- {
-
JFrame jf = new JFrame("调整表格列宽");
-
JMenuBar menuBar = new JMenuBar();
-
JMenu adjustModeMenu = new JMenu("调整方式");
-
JMenu selectUnitMenu = new JMenu("选择单元");
-
JMenu selectModeMenu = new JMenu("选择方式");
-
-
-
JRadioButtonMenuItem[] adjustModesItem = new JRadioButtonMenuItem[5];
-
-
JRadioButtonMenuItem[] selectModesItem = new JRadioButtonMenuItem[3];
-
-
JCheckBoxMenuItem rowsItem = new JCheckBoxMenuItem("选择行");
-
JCheckBoxMenuItem columnsItem = new JCheckBoxMenuItem("选择列");
-
JCheckBoxMenuItem cellsItem = new JCheckBoxMenuItem("选择单元格");
-
ButtonGroup adjustBg = new ButtonGroup();
-
ButtonGroup selectBg = new ButtonGroup();
-
-
int[] adjustModes = new int[]{
- JTable.AUTO_RESIZE_OFF,
- JTable.AUTO_RESIZE_NEXT_COLUMN,
- JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS,
- JTable.AUTO_RESIZE_LAST_COLUMN,
- JTable.AUTO_RESIZE_ALL_COLUMNS
- };
-
int[] selectModes = new int[]{
- ListSelectionModel.MULTIPLE_INTERVAL_SELECTION ,
- ListSelectionModel.SINGLE_INTERVAL_SELECTION ,
- ListSelectionModel.SINGLE_SELECTION
- };
- JTable table;
-
- Object[][] tableData =
- {
-
new Object[]{"李清照" , 29 , "女"},
-
new Object[]{"苏格拉底", 56 , "男"},
-
new Object[]{"李白", 35 , "男"},
-
new Object[]{"弄玉", 18 , "女"},
-
new Object[]{"虎头" , 2 , "男"}
- };
-
-
Object[] columnTitle = {"姓名" , "年龄" , "性别"};
-
-
public void init()
- {
-
-
table = new JTable(tableData , columnTitle);
-
-
-
adjustModesItem[0] = new JRadioButtonMenuItem("只调整表格");
-
adjustModesItem[1] = new JRadioButtonMenuItem("只调整下一列");
-
adjustModesItem[2] = new JRadioButtonMenuItem("平均调整余下列");
-
adjustModesItem[3] = new JRadioButtonMenuItem("只调整最后一列");
-
adjustModesItem[4] = new JRadioButtonMenuItem("平均调整所有列");
- menuBar.add(adjustModeMenu);
-
for (int i = 0; i < adjustModesItem.length ; i++)
- {
-
-
if (i == 2)
- {
-
adjustModesItem[i].setSelected(true);
- }
- adjustBg.add(adjustModesItem[i]);
- adjustModeMenu.add(adjustModesItem[i]);
-
final int index = i;
-
-
adjustModesItem[i].addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent evt)
- {
-
-
if (adjustModesItem[index].isSelected())
- {
- table.setAutoResizeMode(adjustModes[index]);
- }
- }
- });
- }
-
-
selectModesItem[0] = new JRadioButtonMenuItem("无限制");
-
selectModesItem[1] = new JRadioButtonMenuItem("单独的连续区");
-
selectModesItem[2] = new JRadioButtonMenuItem("单选");
- menuBar.add(selectModeMenu);
-
for (int i = 0; i < selectModesItem.length ; i++)
- {
-
-
if (i == 0)
- {
-
selectModesItem[i].setSelected(true);
- }
- selectBg.add(selectModesItem[i]);
- selectModeMenu.add(selectModesItem[i]);
-
final int index = i;
-
-
selectModesItem[i].addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent evt)
- {
-
-
if (selectModesItem[index].isSelected())
- {
- table.getSelectionModel().setSelectionMode(selectModes[index]);
- }
- }
- });
- }
- menuBar.add(selectUnitMenu);
-
- rowsItem.setSelected(table.getRowSelectionAllowed());
- columnsItem.setSelected(table.getColumnSelectionAllowed());
- cellsItem.setSelected(table.getCellSelectionEnabled());
-
-
rowsItem.addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent event)
- {
- table.clearSelection();
-
- table.setRowSelectionAllowed(rowsItem.isSelected());
-
- cellsItem.setSelected(table.getCellSelectionEnabled());
- }
- });
- selectUnitMenu.add(rowsItem);
-
columnsItem.addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent event)
- {
- table.clearSelection();
-
- table.setColumnSelectionAllowed(columnsItem.isSelected());
-
- cellsItem.setSelected(table.getCellSelectionEnabled());
- }
- });
- selectUnitMenu.add(columnsItem);
-
cellsItem.addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent event)
- {
- table.clearSelection();
-
- table.setCellSelectionEnabled(cellsItem.isSelected());
-
- rowsItem.setSelected(table.getRowSelectionAllowed());
- columnsItem.setSelected(table.getColumnSelectionAllowed());
- }
- });
- selectUnitMenu.add(cellsItem);
-
- jf.setJMenuBar(menuBar);
-
-
TableColumn nameColumn = table.getColumn(columnTitle[0]);
-
nameColumn.setMinWidth(40);
-
TableColumn ageColumn = table.getColumn(columnTitle[1]);
-
ageColumn.setPreferredWidth(50);
-
TableColumn genderColumn = table.getColumn(columnTitle[2]);
-
genderColumn.setMaxWidth(50);
-
-
-
-
jf.add(new JScrollPane(table));
- System.out.println(table.getModel());
- jf.pack();
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
jf.setVisible(true);
- }
-
-
public static void main(String[] args)
- {
-
new AdjustingWidth().init();
- }
- }
和JList,JTree类似,JTable采用TableModel来保存表格中的所有状态数据,采用TableColumnModel来保存所有列的数据。eg
- public class TestDefaultTableModel
- {
-
JFrame mainWin = new JFrame("管理数据行、数据列");
-
final int COLUMN_COUNT = 5;
- DefaultTableModel model;
- JTable table;
-
-
ArrayList<TableColumn> hiddenColumns = new ArrayList<TableColumn>();
-
public void init()
- {
-
model = new DefaultTableModel(COLUMN_COUNT ,COLUMN_COUNT);
-
for (int i = 0; i < COLUMN_COUNT ; i++ )
- {
-
for (int j = 0; j < COLUMN_COUNT ; j++ )
- {
-
model.setValueAt("老单元格值 " + i + " " + j , i , j);
- }
- }
-
-
table = new JTable(model);
-
-
mainWin.add(new JScrollPane(table), BorderLayout.CENTER);
-
-
-
JMenuBar menuBar = new JMenuBar();
- mainWin.setJMenuBar(menuBar);
-
JMenu tableMenu = new JMenu("管理");
- menuBar.add(tableMenu);
-
-
JMenuItem hideColumnsItem = new JMenuItem("隐藏选中列");
-
hideColumnsItem.addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent event)
- {
-
-
int[] selected = table.getSelectedColumns();
- TableColumnModel columnModel = table.getColumnModel();
-
-
for (int i = selected.length - 1; i >= 0; i--)
- {
- TableColumn column = columnModel.getColumn(selected[i]);
- table.removeColumn(column);
-
- hiddenColumns.add(column);
- }
- }
- });
- tableMenu.add(hideColumnsItem);
-
-
JMenuItem showColumnsItem = new JMenuItem("显示隐藏列");
-
showColumnsItem.addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent event)
- {
-
-
for (TableColumn tc : hiddenColumns)
- {
-
- table.addColumn(tc);
- }
-
- hiddenColumns.clear();
- }
- });
- tableMenu.add(showColumnsItem);
-
-
JMenuItem addColumnItem = new JMenuItem("插入选中列");
-
addColumnItem.addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent event)
- {
-
-
int[] selected = table.getSelectedColumns();
- TableColumnModel columnModel = table.getColumnModel();
-
-
for (int i = selected.length - 1; i >= 0; i--)
- {
- TableColumn column = columnModel.getColumn(selected[i]);
- table.addColumn(column);
- }
- }
- });
- tableMenu.add(addColumnItem);
-
-
JMenuItem addRowItem = new JMenuItem("增加行");
-
addRowItem.addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent event)
- {
-
-
String[] newCells = new String[COLUMN_COUNT];
-
for (int i = 0; i < newCells.length; i++)
- {
-
newCells[i] = "新单元格值 " + model.getRowCount() + " " + i;
- }
-
- model.addRow(newCells);
- }
- });
- tableMenu.add(addRowItem);
-
-
JMenuItem removeRowsItem = new JMenuItem("删除选中行");
-
removeRowsItem.addActionListener(new ActionListener()
- {
-
public void actionPerformed(ActionEvent event)
- {
-
-
int[] selected = table.getSelectedRows();
-
-
for (int i = selected.length - 1; i >= 0; i--)
- {
- model.removeRow(selected[i]);
- }
- }
- });
- tableMenu.add(removeRowsItem);
-
- mainWin.pack();
- mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
mainWin.setVisible(true);
- }
-
-
public static void main(String[] args)
- {
-
new TestDefaultTableModel().init();
- }
- }
但要注意列的增加,只是将原来隐藏的列显示,而不是真正增加列,你要新增的话那就重新new个JTable
前面讲的表格,单元格都是字符串,这是由于我们传入的都是DefaultTableModel它最终调用toString方法来绘制表格,具体自定义单元格的方法如下,eg
- public class TestTableCellRenderer
- {
-
JFrame jf = new JFrame("使用单元格绘制器");
- JTable table;
-
- Object[][] tableData =
- {
-
new Object[]{"李清照" , 29 , "女" , new ImageIcon("icon/3.gif") , true},
-
new Object[]{"苏格拉底", 56 , "男" , new ImageIcon("icon/1.gif") , false},
-
new Object[]{"李白", 35 , "男" , new ImageIcon("icon/4.gif") , true},
-
new Object[]{"弄玉", 18 , "女" , new ImageIcon("icon/2.gif") , true},
-
new Object[]{"虎头" , 2 , "男" , new ImageIcon("icon/5.gif") , true}
- };
-
-
String[] columnTitle = {"姓名" , "年龄" , "性别" , "主头像" , "是否中国人"};
-
public void init()
- {
-
-
ExtendedTableModel model = new ExtendedTableModel(columnTitle , tableData);
-
-
table = new JTable( model);
-
table.setRowSelectionAllowed(false);
-
table.setRowHeight(40);
-
-
TableColumn lastColumn = table.getColumnModel().getColumn(2);
-
-
lastColumn.setCellRenderer(new GenderTableCellRenderer());
-
-
-
jf.add(new JScrollPane(table));
- jf.pack();
- jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
jf.setVisible(true);
- }
-
public static void main(String[] args)
- {
-
new TestTableCellRenderer().init();
- }
- }
-
-
class ExtendedTableModel extends DefaultTableModel
- {
-
-
public ExtendedTableModel(String[] columnNames , Object[][] cells)
- {
-
super(cells , columnNames);
- }
-
-
public Class getColumnClass(int c)
- {
-
return getValueAt(0 , c).getClass();
- }
- }
-
-
class GenderTableCellRenderer extends JPanel implements TableCellRenderer
- {
-
private String cellValue;
-
-
final int ICON_WIDTH = 23;
-
final int ICON_HEIGHT = 21;
-
public Component getTableCellRendererComponent(JTable table, Object value,
-
boolean isSelected, boolean hasFocus, int row, int column)
- {
- cellValue = (String)value;
-
-
if (hasFocus)
- {
-
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
- }
-
else
- {
-
setBorder(null);
- }
-
return this;
- }
-
-
public void paint(Graphics g)
- {
-
-
if (cellValue.equalsIgnoreCase("男")
-
|| cellValue.equalsIgnoreCase("male"))
- {
-
drawImage(g , new ImageIcon("icon/male.gif").getImage());
- }
-
-
if (cellValue.equalsIgnoreCase("女")
-
|| cellValue.equalsIgnoreCase("female"))
- {
-
drawImage(g , new ImageIcon("icon/female.gif").getImage());
- }
- }
-
-
private void drawImage(Graphics g , Image image)
- {
-
g.drawImage(image, (getWidth() - ICON_WIDTH ) / 2
-
, (getHeight() - ICON_HEIGHT) / 2 , null);
- }
- }
我这里只是实现了每列不同的控件,大家还可以自定义一个表格每行每列都是不同的控件,那就要得到单元格再setCellRender。
原文链接:http://blog.csdn.net/terryzero/article/details/3838423