表格是GUI編程中使用較多,但也是最麻煩的一個控件之一。表格是用來顯示二維數據,提供編輯,選擇等功能。如果只是顯示數據,這還是非常easy的,只要在JTable中傳入二維數組或集合就可以了,eg[c-sharp]view plaincopy
publicclass 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 = {"姓名" , "年齡" , "性別"};
publicvoid init()
{
//以二維數組和一維數組來創建一個JTable對象
table = new JTable(tableData , columnTitle);
//將JTable對象放在JScrollPane中,並將該JScrollPane放在窗口中顯示出來
jf.add(new JScrollPane(table));
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
publicstaticvoid main(String[] args)
{
new SimpleTable().init();
}
}
下面舉個JTable表格調整和選擇方式的例子,eg[java]view plaincopy
publicclass AdjustingWidth
{
JFrame jf = new JFrame("調整表格列寬");
JMenuBar menuBar = new JMenuBar();
JMenu adjustModeMenu = new JMenu("調整方式");
JMenu selectUnitMenu = new JMenu("選擇單元");
JMenu selectModeMenu = new JMenu("選擇方式");
//定義5個單選框按鈕,用以控制表格的寬度調整方式
JRadioButtonMenuItem[] adjustModesItem = new JRadioButtonMenuItem[5];
//定義3個單選框按鈕,用以控制表格的選擇方式
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類型的數組,用於保存表格所有的寬度調整方式
int[] adjustModes = newint[]{
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 = newint[]{
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 = {"姓名" , "年齡" , "性別"};
publicvoid init()
{
//以二維數組和一維數組來創建一個JTable對象
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]);
finalint index = i;
//爲設置調整方式的菜單項添加監聽器
adjustModesItem[i].addActionListener(new ActionListener()
{
publicvoid 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]);
finalint index = i;
//爲設置選擇方式的菜單項添加監聽器
selectModesItem[i].addActionListener(new ActionListener()
{
publicvoid 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()
{
publicvoid actionPerformed(ActionEvent event)
{
table.clearSelection();
//如果該菜單項處於選中狀態,設置表格的選擇單元是行
table.setRowSelectionAllowed(rowsItem.isSelected());
//如果選擇行、選擇列同時被選中,其實質是選擇單元格
cellsItem.setSelected(table.getCellSelectionEnabled());
}
});
selectUnitMenu.add(rowsItem);
columnsItem.addActionListener(new ActionListener()
{
publicvoid actionPerformed(ActionEvent event)
{
table.clearSelection();
//如果該菜單項處於選中狀態,設置表格的選擇單元是列
table.setColumnSelectionAllowed(columnsItem.isSelected());
//如果選擇行、選擇列同時被選中,其實質是選擇單元格
cellsItem.setSelected(table.getCellSelectionEnabled());
}
});
selectUnitMenu.add(columnsItem);
cellsItem.addActionListener(new ActionListener()
{
publicvoid 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);
//將JTable對象放在JScrollPane中,並將該JScrollPane放在窗口中顯示出來
jf.add(new JScrollPane(table));
System.out.println(table.getModel());
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
publicstaticvoid main(String[] args)
{
new AdjustingWidth().init();
}
}
我這裏只是實現了每列不同的控件,大家還可以自定義一個表格每行每列都是不同的控件,那就要得到單元格再setCellRender。
原創地址:http://blog.csdn.net/terryzero/article/details/3838423