Java Swing組件編程之JTable表格用法實例詳解
本文實例講述了Java Swing組件編程之JTable表格用法。分享給大家供大家參考,具體如下:
表格是GUI編程中使用較多,但也是最麻煩的一個控件之一。表格是用來顯示二維數(shù)據(jù),提供編輯,選擇等功能。如果只是顯示數(shù)據(jù),這還是非常easy的,只要在JTable中傳入二維數(shù)組或集合就可以了。
示例1:
package awtDemo;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class SimpleTable
{
JFrame jf = new JFrame("簡單表格 - chabaoo.cn");
JTable table;
//定義二維數(shù)組作為表格數(shù)據(jù)
Object[][] tableData =
{
new Object[]{"李清照" , 29 , "女"},
new Object[]{"蘇格拉底", 56 , "男"},
new Object[]{"李白", 35 , "男"},
new Object[]{"弄玉", 18 , "女"},
new Object[]{"虎頭" , 2 , "男"}
};
//定義一維數(shù)據(jù)作為列標(biāo)題
Object[] columnTitle = {"姓名" , "年齡" , "性別"};
public void init()
{
//以二維數(shù)組和一維數(shù)組來創(chuàng)建一個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);
}
public static void main(String[] args)
{
new SimpleTable().init();
}
}
運行效果:

下面舉個JTable表格調(diào)整和選擇方式的例子。
示例2:
package awtDemo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableColumn;
public class AdjustingWidth
{
JFrame jf = new JFrame("調(diào)整表格列寬 - chabaoo.cn");
JMenuBar menuBar = new JMenuBar();
JMenu adjustModeMenu = new JMenu("調(diào)整方式");
JMenu selectUnitMenu = new JMenu("選擇單元");
JMenu selectModeMenu = new JMenu("選擇方式");
//定義5個單選框按鈕,用以控制表格的寬度調(diào)整方式
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類型的數(shù)組,用于保存表格所有的寬度調(diào)整方式
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;
//定義二維數(shù)組作為表格數(shù)據(jù)
Object[][] tableData =
{
new Object[]{"李清照" , 29 , "女"},
new Object[]{"蘇格拉底", 56 , "男"},
new Object[]{"李白", 35 , "男"},
new Object[]{"弄玉", 18 , "女"},
new Object[]{"虎頭" , 2 , "男"}
};
//定義一維數(shù)據(jù)作為列標(biāo)題
Object[] columnTitle = {"姓名" , "年齡" , "性別"};
public void init()
{
//以二維數(shù)組和一維數(shù)組來創(chuàng)建一個JTable對象
table = new JTable(tableData , columnTitle);
//-----------為窗口安裝設(shè)置表格調(diào)整方式的菜單-----------
adjustModesItem[0] = new JRadioButtonMenuItem("只調(diào)整表格");
adjustModesItem[1] = new JRadioButtonMenuItem("只調(diào)整下一列");
adjustModesItem[2] = new JRadioButtonMenuItem("平均調(diào)整余下列");
adjustModesItem[3] = new JRadioButtonMenuItem("只調(diào)整最后一列");
adjustModesItem[4] = new JRadioButtonMenuItem("平均調(diào)整所有列");
menuBar.add(adjustModeMenu);
for (int i = 0; i < adjustModesItem.length ; i++)
{
//默認選中第三個菜單項,即對應(yīng)表格默認的寬度調(diào)整方式
if (i == 2)
{
adjustModesItem[i].setSelected(true);
}
adjustBg.add(adjustModesItem[i]);
adjustModeMenu.add(adjustModesItem[i]);
final int index = i;
//為設(shè)置調(diào)整方式的菜單項添加監(jiān)聽器
adjustModesItem[i].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//如果當(dāng)前菜單項處于選中狀態(tài),表格使用對應(yīng)的調(diào)整方式
if (adjustModesItem[index].isSelected())
{
table.setAutoResizeMode(adjustModes[index]);
}
}
public void actionPerformed1(ActionEvent e) {
// TODO 自動生成的方法存根
}
});
}
//-----------為窗口安裝設(shè)置表格選擇方式的菜單-----------
selectModesItem[0] = new JRadioButtonMenuItem("無限制");
selectModesItem[1] = new JRadioButtonMenuItem("單獨的連續(xù)區(qū)");
selectModesItem[2] = new JRadioButtonMenuItem("單選");
menuBar.add(selectModeMenu);
for (int i = 0; i < selectModesItem.length ; i++)
{
//默認選中第一個菜單項,即對應(yīng)表格默認的選擇方式
if (i == 0)
{
selectModesItem[i].setSelected(true);
}
selectBg.add(selectModesItem[i]);
selectModeMenu.add(selectModesItem[i]);
final int index = i;
//為設(shè)置選擇方式的菜單項添加監(jiān)聽器
selectModesItem[i].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//如果當(dāng)前菜單項處于選中狀態(tài),表格使用對應(yīng)的選擇方式
if (selectModesItem[index].isSelected())
{
table.getSelectionModel().setSelectionMode(selectModes[index]);
}
}
});
}
menuBar.add(selectUnitMenu);
//-----------為窗口安裝設(shè)置表格選擇單元的菜單-----------
rowsItem.setSelected(table.getRowSelectionAllowed());
columnsItem.setSelected(table.getColumnSelectionAllowed());
cellsItem.setSelected(table.getCellSelectionEnabled());
rowsItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
table.clearSelection();
//如果該菜單項處于選中狀態(tài),設(shè)置表格的選擇單元是行
table.setRowSelectionAllowed(rowsItem.isSelected());
//如果選擇行、選擇列同時被選中,其實質(zhì)是選擇單元格
cellsItem.setSelected(table.getCellSelectionEnabled());
}
});
selectUnitMenu.add(rowsItem);
columnsItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
table.clearSelection();
//如果該菜單項處于選中狀態(tài),設(shè)置表格的選擇單元是列
table.setColumnSelectionAllowed(columnsItem.isSelected());
//如果選擇行、選擇列同時被選中,其實質(zhì)是選擇單元格
cellsItem.setSelected(table.getCellSelectionEnabled());
}
});
selectUnitMenu.add(columnsItem);
cellsItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
table.clearSelection();
//如果該菜單項處于選中狀態(tài),設(shè)置表格的選擇單元是單元格
table.setCellSelectionEnabled(cellsItem.isSelected());
//該選項的改變會同時影響選擇行、選擇列兩個菜單
rowsItem.setSelected(table.getRowSelectionAllowed());
columnsItem.setSelected(table.getColumnSelectionAllowed());
}
});
selectUnitMenu.add(cellsItem);
jf.setJMenuBar(menuBar);
//分別獲取表格的三個表格列,并設(shè)置三列的最小寬度,最佳寬度和最大寬度
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);
}
public static void main(String[] args)
{
new AdjustingWidth().init();
}
}
運行效果:

和JList,JTree類似,JTable采用TableModel來保存表格中的所有狀態(tài)數(shù)據(jù),采用TableColumnModel來保存所有列的數(shù)據(jù)。
示例3:
package awtDemo;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class TestDefaultTableModel
{
JFrame mainWin = new JFrame("管理數(shù)據(jù)行、數(shù)據(jù)列 - chabaoo.cn");
final int COLUMN_COUNT = 5;
DefaultTableModel model;
JTable table;
//用于保存被隱藏列的List集合
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 actionPerformed1(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);
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自動生成的方法存根
}
});
tableMenu.add(hideColumnsItem);
JMenuItem showColumnsItem = new JMenuItem("顯示隱藏列");
showColumnsItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
//把所有隱藏列依次顯示出來
for (TableColumn tc : hiddenColumns)
{
//依次把所有隱藏的列顯示出來
table.addColumn(tc);
}
//清空保存隱藏列的List集合
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();
//依次把選中的列添加到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()
{
public void actionPerformed(ActionEvent event)
{
//創(chuàng)建一個String數(shù)組作為新增行的內(nèi)容
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()
{
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它最終調(diào)用toString方法來繪制表格,具體自定義單元格的方法如下,
示例4:
public class TestTableCellRenderer
{
JFrame jf = new JFrame("使用單元格繪制器");
JTable table;
//定義二維數(shù)組作為表格數(shù)據(jù)
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}
};
//定義一維數(shù)據(jù)作為列標(biāo)題
String[] columnTitle = {"姓名" , "年齡" , "性別" , "主頭像" , "是否中國人"};
public void init()
{
//以二維數(shù)組和一維數(shù)組來創(chuàng)建一個ExtendedTableModel對象
ExtendedTableModel model = new ExtendedTableModel(columnTitle , tableData);
//以ExtendedTableModel來創(chuàng)建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);
}
public static void main(String[] args)
{
new TestTableCellRenderer().init();
}
}
class ExtendedTableModel extends DefaultTableModel
{
//重新提供一個構(gòu)造器,該構(gòu)造器的實現(xiàn)委托給DefaultTableModel父類
public ExtendedTableModel(String[] columnNames , Object[][] cells)
{
super(cells , columnNames);
}
//重寫getColumnClass方法,根據(jù)每列的第一個值來返回其真實的數(shù)據(jù)類型
public Class getColumnClass(int c)
{
return getValueAt(0 , c).getClass();
}
}
class GenderTableCellRenderer extends JPanel implements TableCellRenderer
{
private String cellValue;
//定義圖標(biāo)的寬度和高度
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;
//設(shè)置選中狀態(tài)下繪制邊框
if (hasFocus)
{
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
}
else
{
setBorder(null);
}
return this;
}
//重寫paint方法,負責(zé)繪制該單元格內(nèi)容
public void paint(Graphics g)
{
//如果表格值為"男"或"male",則繪制一個男性圖標(biāo)
if (cellValue.equalsIgnoreCase("男")
|| cellValue.equalsIgnoreCase("male"))
{
drawImage(g , new ImageIcon("icon/male.gif").getImage());
}
//如果表格值為"女"或"female",則繪制一個女性圖標(biāo)
if (cellValue.equalsIgnoreCase("女")
|| cellValue.equalsIgnoreCase("female"))
{
drawImage(g , new ImageIcon("icon/female.gif").getImage());
}
}
//繪制圖標(biāo)的方法
private void drawImage(Graphics g , Image image)
{
g.drawImage(image, (getWidth() - ICON_WIDTH ) / 2
, (getHeight() - ICON_HEIGHT) / 2 , null);
}
}
我這里只是實現(xiàn)了每列不同的控件,大家還可以自定義一個表格每行每列都是不同的控件,那就要得到單元格再setCellRender。
更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
SpringBoot+Mybatis使用Mapper接口注冊的幾種方式
本篇博文中主要介紹是Mapper接口與對應(yīng)的xml文件如何關(guān)聯(lián)的幾種姿勢,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
spring boot idea maven依賴找不到問題處理方法
這篇文章主要介紹了spring boot idea 偶爾maven依賴找不到問題,這里總結(jié)了幾種處理方法,方便嘗試排查,對spring boot idea maven依賴找不到問題感興趣的朋友跟隨小編一起看看吧2023-08-08
帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之隊列
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01
解決@PostConstruct注解導(dǎo)致的程序無法啟動(@PostConstruct的執(zhí)行)
這篇文章主要介紹了解決@PostConstruct注解導(dǎo)致的程序無法啟動(@PostConstruct的執(zhí)行)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
SpringBoot2 整合FreeMarker實現(xiàn)頁面靜態(tài)化示例詳解
這篇文章主要介紹了SpringBoot2 整合FreeMarker實現(xiàn)頁面靜態(tài)化示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

