如何在Java中使用JTable表格

这篇文章将为大家详细讲解有关如何在Java中使用JTable表格,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

表格是GUI编程中使用较多,但也是最麻烦的一个控件之一。表格是用来显示二维数据,提供编辑,选择等功能。如果只是显示数据,这还是非常easy的,只要在JTable中传入二维数组或集合就可以了。

示例1:

packageawtDemo;
importjavax.swing.JFrame;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
publicclassSimpleTable
{
JFramejf=newJFrame("简单表格-www.jb51.net");
JTabletable;
//定义二维数组作为表格数据
Object[][]tableData=
{
newObject[]{"李清照",29,"女"},
newObject[]{"苏格拉底",56,"男"},
newObject[]{"李白",35,"男"},
newObject[]{"弄玉",18,"女"},
newObject[]{"虎头",2,"男"}
};
//定义一维数据作为列标题
Object[]columnTitle={"姓名","年龄","性别"};
publicvoidinit()
{
//以二维数组和一维数组来创建一个JTable对象
table=newJTable(tableData,columnTitle);
//将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来
jf.add(newJScrollPane(table));
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
publicstaticvoidmain(String[]args)
{
newSimpleTable().init();
}
}

运行效果:

如何在Java中使用JTable表格

下面举个JTable表格调整和选择方式的例子。

示例2:

packageawtDemo;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.ButtonGroup;
importjavax.swing.JCheckBoxMenuItem;
importjavax.swing.JFrame;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JRadioButtonMenuItem;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.ListSelectionModel;
importjavax.swing.table.TableColumn;
publicclassAdjustingWidth
{
JFramejf=newJFrame("调整表格列宽-www.jb51.net");
JMenuBarmenuBar=newJMenuBar();
JMenuadjustModeMenu=newJMenu("调整方式");
JMenuselectUnitMenu=newJMenu("选择单元");
JMenuselectModeMenu=newJMenu("选择方式");
//定义5个单选框按钮,用以控制表格的宽度调整方式
JRadioButtonMenuItem[]adjustModesItem=newJRadioButtonMenuItem[5];
//定义3个单选框按钮,用以控制表格的选择方式
JRadioButtonMenuItem[]selectModesItem=newJRadioButtonMenuItem[3];
JCheckBoxMenuItemrowsItem=newJCheckBoxMenuItem("选择行");
JCheckBoxMenuItemcolumnsItem=newJCheckBoxMenuItem("选择列");
JCheckBoxMenuItemcellsItem=newJCheckBoxMenuItem("选择单元格");
ButtonGroupadjustBg=newButtonGroup();
ButtonGroupselectBg=newButtonGroup();
//定义一个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
};
JTabletable;
//定义二维数组作为表格数据
Object[][]tableData=
{
newObject[]{"李清照",29,"女"},
newObject[]{"苏格拉底",56,"男"},
newObject[]{"李白",35,"男"},
newObject[]{"弄玉",18,"女"},
newObject[]{"虎头",2,"男"}
};
//定义一维数据作为列标题
Object[]columnTitle={"姓名","年龄","性别"};
publicvoidinit()
{
//以二维数组和一维数组来创建一个JTable对象
table=newJTable(tableData,columnTitle);
//-----------为窗口安装设置表格调整方式的菜单-----------
adjustModesItem[0]=newJRadioButtonMenuItem("只调整表格");
adjustModesItem[1]=newJRadioButtonMenuItem("只调整下一列");
adjustModesItem[2]=newJRadioButtonMenuItem("平均调整余下列");
adjustModesItem[3]=newJRadioButtonMenuItem("只调整最后一列");
adjustModesItem[4]=newJRadioButtonMenuItem("平均调整所有列");
menuBar.add(adjustModeMenu);
for(inti=0;i<adjustModesItem.length;i++)
{
//默认选中第三个菜单项,即对应表格默认的宽度调整方式
if(i==2)
{
adjustModesItem[i].setSelected(true);
}
adjustBg.add(adjustModesItem[i]);
adjustModeMenu.add(adjustModesItem[i]);
finalintindex=i;
//为设置调整方式的菜单项添加监听器
adjustModesItem[i].addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevt)
{
//如果当前菜单项处于选中状态,表格使用对应的调整方式
if(adjustModesItem[index].isSelected())
{
table.setAutoResizeMode(adjustModes[index]);
}
}
publicvoidactionPerformed1(ActionEvente){
//TODO自动生成的方法存根

}
});
}
//-----------为窗口安装设置表格选择方式的菜单-----------
selectModesItem[0]=newJRadioButtonMenuItem("无限制");
selectModesItem[1]=newJRadioButtonMenuItem("单独的连续区");
selectModesItem[2]=newJRadioButtonMenuItem("单选");
menuBar.add(selectModeMenu);
for(inti=0;i<selectModesItem.length;i++)
{
//默认选中第一个菜单项,即对应表格默认的选择方式
if(i==0)
{
selectModesItem[i].setSelected(true);
}
selectBg.add(selectModesItem[i]);
selectModeMenu.add(selectModesItem[i]);
finalintindex=i;
//为设置选择方式的菜单项添加监听器
selectModesItem[i].addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevt)
{
//如果当前菜单项处于选中状态,表格使用对应的选择方式
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(newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
table.clearSelection();
//如果该菜单项处于选中状态,设置表格的选择单元是行
table.setRowSelectionAllowed(rowsItem.isSelected());
//如果选择行、选择列同时被选中,其实质是选择单元格
cellsItem.setSelected(table.getCellSelectionEnabled());
}
});
selectUnitMenu.add(rowsItem);
columnsItem.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
table.clearSelection();
//如果该菜单项处于选中状态,设置表格的选择单元是列
table.setColumnSelectionAllowed(columnsItem.isSelected());
//如果选择行、选择列同时被选中,其实质是选择单元格
cellsItem.setSelected(table.getCellSelectionEnabled());
}
});
selectUnitMenu.add(columnsItem);
cellsItem.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
table.clearSelection();
//如果该菜单项处于选中状态,设置表格的选择单元是单元格
table.setCellSelectionEnabled(cellsItem.isSelected());
//该选项的改变会同时影响选择行、选择列两个菜单
rowsItem.setSelected(table.getRowSelectionAllowed());
columnsItem.setSelected(table.getColumnSelectionAllowed());
}
});
selectUnitMenu.add(cellsItem);
jf.setJMenuBar(menuBar);
//分别获取表格的三个表格列,并设置三列的最小宽度,最佳宽度和最大宽度
TableColumnnameColumn=table.getColumn(columnTitle[0]);
nameColumn.setMinWidth(40);
TableColumnageColumn=table.getColumn(columnTitle[1]);
ageColumn.setPreferredWidth(50);
TableColumngenderColumn=table.getColumn(columnTitle[2]);
genderColumn.setMaxWidth(50);
//将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来
jf.add(newJScrollPane(table));
System.out.println(table.getModel());
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
publicstaticvoidmain(String[]args)
{
newAdjustingWidth().init();
}
}

运行效果:

如何在Java中使用JTable表格

和JList,JTree类似,JTable采用TableModel来保存表格中的所有状态数据,采用TableColumnModel来保存所有列的数据。

示例3:

packageawtDemo;
importjava.awt.BorderLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.ArrayList;
importjavax.swing.JFrame;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.table.DefaultTableModel;
importjavax.swing.table.TableColumn;
importjavax.swing.table.TableColumnModel;
publicclassTestDefaultTableModel
{
JFramemainWin=newJFrame("管理数据行、数据列-www.jb51.net");
finalintCOLUMN_COUNT=5;
DefaultTableModelmodel;
JTabletable;
//用于保存被隐藏列的List集合
ArrayList<TableColumn>hiddenColumns=newArrayList<TableColumn>();
publicvoidinit()
{
model=newDefaultTableModel(COLUMN_COUNT,COLUMN_COUNT);
for(inti=0;i<COLUMN_COUNT;i++)
{
for(intj=0;j<COLUMN_COUNT;j++)
{
model.setValueAt("老单元格值"+i+""+j,i,j);
}
}
table=newJTable(model);
mainWin.add(newJScrollPane(table),BorderLayout.CENTER);
//为窗口安装菜单
JMenuBarmenuBar=newJMenuBar();
mainWin.setJMenuBar(menuBar);
JMenutableMenu=newJMenu("管理");
menuBar.add(tableMenu);
JMenuItemhideColumnsItem=newJMenuItem("隐藏选中列");
hideColumnsItem.addActionListener(newActionListener()
{
publicvoidactionPerformed1(ActionEventevent)
{
//获取所有选中列的索引
int[]selected=table.getSelectedColumns();
TableColumnModelcolumnModel=table.getColumnModel();
//依次把每一个选中的列隐藏起来,并使用List把这些列保存起来
for(inti=selected.length-1;i>=0;i--)
{
TableColumncolumn=columnModel.getColumn(selected[i]);
table.removeColumn(column);
//把隐藏的列保存起来,确保以后可以显示出来
hiddenColumns.add(column);
}
}
@Override
publicvoidactionPerformed(ActionEvente){
//TODO自动生成的方法存根

}
});
tableMenu.add(hideColumnsItem);
JMenuItemshowColumnsItem=newJMenuItem("显示隐藏列");
showColumnsItem.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
//把所有隐藏列依次显示出来
for(TableColumntc:hiddenColumns)
{
//依次把所有隐藏的列显示出来
table.addColumn(tc);
}
//清空保存隐藏列的List集合
hiddenColumns.clear();
}
});
tableMenu.add(showColumnsItem);
JMenuItemaddColumnItem=newJMenuItem("插入选中列");
addColumnItem.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
//获取所有选中列的索引
int[]selected=table.getSelectedColumns();
TableColumnModelcolumnModel=table.getColumnModel();
//依次把选中的列添加到JTable之后
for(inti=selected.length-1;i>=0;i--)
{
TableColumncolumn=columnModel.getColumn(selected[i]);
table.addColumn(column);
}
}
});
tableMenu.add(addColumnItem);
JMenuItemaddRowItem=newJMenuItem("增加行");
addRowItem.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
//创建一个String数组作为新增行的内容
String[]newCells=newString[COLUMN_COUNT];
for(inti=0;i<newCells.length;i++)
{
newCells[i]="新单元格值"+model.getRowCount()+""+i;
}
//向TableModel中新增一行。
model.addRow(newCells);
}
});
tableMenu.add(addRowItem);
JMenuItemremoveRowsItem=newJMenuItem("删除选中行");
removeRowsItem.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
//获取所有选中行
int[]selected=table.getSelectedRows();
//依次删除所有选中行
for(inti=selected.length-1;i>=0;i--)
{
model.removeRow(selected[i]);
}
}
});
tableMenu.add(removeRowsItem);
mainWin.pack();
mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWin.setVisible(true);
}
publicstaticvoidmain(String[]args)
{
newTestDefaultTableModel().init();
}
}

运行效果:

如何在Java中使用JTable表格

但要注意列的增加,只是将原来隐藏的列显示,而不是真正增加列,你要新增的话那就重新new个JTable

前面讲的表格,单元格都是字符串,这是由于我们传入的都是DefaultTableModel它最终调用toString方法来绘制表格,具体自定义单元格的方法如下,

示例4:

publicclassTestTableCellRenderer
{
JFramejf=newJFrame("使用单元格绘制器");
JTabletable;
//定义二维数组作为表格数据
Object[][]tableData=
{
newObject[]{"李清照",29,"女",newImageIcon("icon/3.gif"),true},
newObject[]{"苏格拉底",56,"男",newImageIcon("icon/1.gif"),false},
newObject[]{"李白",35,"男",newImageIcon("icon/4.gif"),true},
newObject[]{"弄玉",18,"女",newImageIcon("icon/2.gif"),true},
newObject[]{"虎头",2,"男",newImageIcon("icon/5.gif"),true}
};
//定义一维数据作为列标题
String[]columnTitle={"姓名","年龄","性别","主头像","是否中国人"};
publicvoidinit()
{
//以二维数组和一维数组来创建一个ExtendedTableModel对象
ExtendedTableModelmodel=newExtendedTableModel(columnTitle,tableData);
//以ExtendedTableModel来创建JTable
table=newJTable(model);
table.setRowSelectionAllowed(false);
table.setRowHeight(40);
//获取第三列
TableColumnlastColumn=table.getColumnModel().getColumn(2);
//对第三列采用自定义的单元格绘制器
lastColumn.setCellRenderer(newGenderTableCellRenderer());
//将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来
jf.add(newJScrollPane(table));
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
publicstaticvoidmain(String[]args)
{
newTestTableCellRenderer().init();
}
}
classExtendedTableModelextendsDefaultTableModel
{
//重新提供一个构造器,该构造器的实现委托给DefaultTableModel父类
publicExtendedTableModel(String[]columnNames,Object[][]cells)
{
super(cells,columnNames);
}
//重写getColumnClass方法,根据每列的第一个值来返回其真实的数据类型
publicClassgetColumnClass(intc)
{
returngetValueAt(0,c).getClass();
}
}
classGenderTableCellRendererextendsJPanelimplementsTableCellRenderer
{
privateStringcellValue;
//定义图标的宽度和高度
finalintICON_WIDTH=23;
finalintICON_HEIGHT=21;
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
booleanisSelected,booleanhasFocus,introw,intcolumn)
{
cellValue=(String)value;
//设置选中状态下绘制边框
if(hasFocus)
{
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
}
else
{
setBorder(null);
}
returnthis;
}
//重写paint方法,负责绘制该单元格内容
publicvoidpaint(Graphicsg)
{
//如果表格值为"男"或"male",则绘制一个男性图标
if(cellValue.equalsIgnoreCase("男")
||cellValue.equalsIgnoreCase("male"))
{
drawImage(g,newImageIcon("icon/male.gif").getImage());
}
//如果表格值为"女"或"female",则绘制一个女性图标
if(cellValue.equalsIgnoreCase("女")
||cellValue.equalsIgnoreCase("female"))
{
drawImage(g,newImageIcon("icon/female.gif").getImage());
}
}
//绘制图标的方法
privatevoiddrawImage(Graphicsg,Imageimage)
{
g.drawImage(image,(getWidth()-ICON_WIDTH)/2
,(getHeight()-ICON_HEIGHT)/2,null);
}
}

关于如何在Java中使用JTable表格就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

发布于 2021-04-03 22:31:34
收藏
分享
海报
0 条评论
159
上一篇:import和export怎么在ES6中使用 下一篇:如何在ES6中使用扩展运算符
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码