Java Swing组件编程之JTable表格用法实例详解
程序员文章站
2023-12-17 21:12:34
本文实例讲述了java swing组件编程之jtable表格用法。分享给大家供大家参考,具体如下:
表格是gui编程中使用较多,但也是最麻烦的一个控件之一。表格是用来显示...
本文实例讲述了java swing组件编程之jtable表格用法。分享给大家供大家参考,具体如下:
表格是gui编程中使用较多,但也是最麻烦的一个控件之一。表格是用来显示二维数据,提供编辑,选择等功能。如果只是显示数据,这还是非常easy的,只要在jtable中传入二维数组或集合就可以了。
示例1:
package awtdemo; import javax.swing.jframe; import javax.swing.jscrollpane; import javax.swing.jtable; public class simpletable { jframe jf = new jframe("简单表格 - www.jb51.net"); jtable table; //定义二维数组作为表格数据 object[][] tabledata = { new object[]{"李清照" , 29 , "女"}, new object[]{"苏格拉底", 56 , "男"}, new object[]{"李白", 35 , "男"}, new object[]{"弄玉", 18 , "女"}, new object[]{"虎头" , 2 , "男"} }; //定义一维数据作为列标题 object[] columntitle = {"姓名" , "年龄" , "性别"}; public void 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); } public static void main(string[] args) { new simpletable().init(); } }
运行效果:
下面举个jtable表格调整和选择方式的例子。
示例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("调整表格列宽 - www.jb51.net"); 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 = 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() { //以二维数组和一维数组来创建一个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]); final int index = i; //为设置调整方式的菜单项添加监听器 adjustmodesitem[i].addactionlistener(new actionlistener() { public void actionperformed(actionevent evt) { //如果当前菜单项处于选中状态,表格使用对应的调整方式 if (adjustmodesitem[index].isselected()) { table.setautoresizemode(adjustmodes[index]); } } public void actionperformed1(actionevent e) { // todo 自动生成的方法存根 } }); } //-----------为窗口安装设置表格选择方式的菜单----------- 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); //将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来保存表格中的所有状态数据,采用tablecolumnmodel来保存所有列的数据。
示例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("管理数据行、数据列 - www.jb51.net"); 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) { //创建一个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() { 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方法来绘制表格,具体自定义单元格的方法如下,
示例4:
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对象 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); } public static void 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; //定义图标的宽度和高度 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; } //重写paint方法,负责绘制该单元格内容 public void 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()); } } //绘制图标的方法 private void drawimage(graphics g , image image) { g.drawimage(image, (getwidth() - icon_width ) / 2 , (getheight() - icon_height) / 2 , null); } }
我这里只是实现了每列不同的控件,大家还可以自定义一个表格每行每列都是不同的控件,那就要得到单元格再setcellrender。
更多关于java相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java字符与字符串操作技巧总结》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。