和JList,JTree相似,JTable採用TableModel來保存表格中的全部狀態數據,採用TableColumnModel來保存全部列的數據。eg[java]view plaincopyjava
publicclass TestDefaultTableModel 數組
{ app
JFrame mainWin = new JFrame("管理數據行、數據列"); ide
finalint COLUMN_COUNT = 5; this
DefaultTableModel model; url
JTable table; spa
//用於保存被隱藏列的List集合.net
ArrayList<TableColumn> hiddenColumns = new ArrayList<TableColumn>(); orm
publicvoid 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()
{
publicvoid actionPerformed(ActionEvent event)
{
//獲取全部選中列的索引
int[] selected = table.getSelectedColumns();
TableColumnModel columnModel = table.getColumnModel();
//依次把每個選中的列隱藏起來,並使用List把這些列保存起來
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()
{
publicvoid actionPerformed(ActionEvent event)
{
//把全部隱藏列依次顯示出來
for (TableColumn tc : hiddenColumns)
{
//依次把全部隱藏的列顯示出來
table.addColumn(tc);
}
//清空保存隱藏列的List集合
hiddenColumns.clear();
}
});
tableMenu.add(showColumnsItem);
JMenuItem addColumnItem = new JMenuItem("插入選中列");
addColumnItem.addActionListener(new ActionListener()
{
publicvoid actionPerformed(ActionEvent event)
{
//獲取全部選中列的索引
int[] selected = table.getSelectedColumns();
TableColumnModel columnModel = table.getColumnModel();
//依次把選中的列添加到JTable以後
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()
{
publicvoid actionPerformed(ActionEvent event)
{
//建立一個String數組做爲新增行的內容
String[] newCells = new String[COLUMN_COUNT];
for (int i = 0; i < newCells.length; i++)
{
newCells[i] = "新單元格值 " + model.getRowCount() + " " + i;
}
//向TableModel中新增一行。
model.addRow(newCells);
}
});
tableMenu.add(addRowItem);
JMenuItem removeRowsItem = new JMenuItem("刪除選中行");
removeRowsItem.addActionListener(new ActionListener()
{
publicvoid 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);
}
publicstaticvoid main(String[] args)
{
new TestDefaultTableModel().init();
}
}
但要注意列的增長,只是將原來隱藏的列顯示,而不是真正增長列,你要新增的話那就從新new個JTable
前面講的表格,單元格都是字符串,這是因爲咱們傳入的都是DefaultTableModel它最終調用toString方法來繪製表格,具體自定義單元格的方法以下,eg[java]view plaincopy
publicclass 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 = {"姓名" , "年齡" , "性別" , "主頭像" , "是否中國人"};
publicvoid init()
{
//以二維數組和一維數組來建立一個ExtendedTableModel對象
ExtendedTableModel model = new ExtendedTableModel(columnTitle , tableData);
//以ExtendedTableModel來建立JTable
table = new JTable( model);
table.setRowSelectionAllowed(false);
table.setRowHeight(40);
//獲取第三列
TableColumn lastColumn = table.getColumnModel().getColumn(2);
//對第三列採用自定義的單元格繪製器
lastColumn.setCellRenderer(new GenderTableCellRenderer());
//將JTable對象放在JScrollPane中,並將該JScrollPane放在窗口中顯示出來
jf.add(new JScrollPane(table));
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
publicstaticvoid main(String[] args)
{
new TestTableCellRenderer().init();
}
}
class ExtendedTableModel extends DefaultTableModel
{
//從新提供一個構造器,該構造器的實現委託給DefaultTableModel父類
public ExtendedTableModel(String[] columnNames , Object[][] cells)
{
super(cells , columnNames);
}
//重寫getColumnClass方法,根據每列的第一個值來返回其真實的數據類型
public Class getColumnClass(int c)
{
return getValueAt(0 , c).getClass();
}
}
class GenderTableCellRenderer extends JPanel implements TableCellRenderer
{
private String cellValue;
//定義圖標的寬度和高度
finalint ICON_WIDTH = 23;
finalint 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);
}
returnthis;
}
//重寫paint方法,負責繪製該單元格內容
publicvoid paint(Graphics g)
{
//若是表格值爲"男"或"male",則繪製一個男性圖標
if (cellValue.equalsIgnoreCase("男")
|| cellValue.equalsIgnoreCase("male"))
{
drawImage(g , new ImageIcon("icon/male.gif").getImage());
}
//若是表格值爲"女"或"female",則繪製一個女性圖標
if (cellValue.equalsIgnoreCase("女")
|| cellValue.equalsIgnoreCase("female"))
{
drawImage(g , new ImageIcon("icon/female.gif").getImage());
}
}
//繪製圖標的方法
privatevoid drawImage(Graphics g , Image p_w_picpath)
{
g.drawImage(p_w_picpath, (getWidth() - ICON_WIDTH ) / 2
, (getHeight() - ICON_HEIGHT) / 2 , null);
}
}
原創地址:http://blog.csdn.net/terryzero/article/details/3838423