,,Java Swing组件编程之JTable表格用法实例详解

,,Java Swing组件编程之JTable表格用法实例详解

这篇文章主要介绍了Java Swing组件编程之JTable表格用法,结合实例形式详细分析了摇摆组件中JTable表格的常见定义与使用方法,需要的朋友可以参考下

本文实例讲述了Java Swing组件编程之JTable表格用法。分享给大家供大家参考,具体如下:

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

示例1:

包awtDemo

导入javax。挥棒。jframe

导入javax。挥棒。jscrollpane

导入javax。挥棒。jtable

公共类简单表

{

JFrame jf=新JFrame('简单表格-www。jb51。net’);

JTable表;

//定义二维数组作为表格数据

对象[][]表数据=

{

新对象[]{ '李清照' , 29 , '女'},

新对象[]{ '苏格拉底', 56 , '男'},

新对象[]{ '李白', 35 , '男'},

新对象[]{ '弄玉', 18 , '女'},

新对象[]{ '虎头' , 2 , '男'}

};

//定义一维数据作为列标题

Object[] columnTitle={ '姓名' , '年龄' , '性别'};

公共void初始化()

{

//以二维数组和一维数组来创建一个JTable对象

table=new JTable(tableData,列标题);

//将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来

jf.add(新JScrollPane(table));

JF。pack();

JF。setdefaultcloseoperation(JFrame .EXIT _ ON _ CLOSE);

JF。设置可见(真);

}

公共静态void main(String[] args)

{

新的SimpleTable().init();

}

}

运行效果:

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

示例2:

包awtDemo

导入Java。awt。事件。动作事件;

导入Java。awt。事件。动作监听器;

导入javax。挥棒。按钮组;

导入javax。挥棒。jcheckboxmenuitem

导入javax。挥棒。jframe

导入javax。挥棒。jmenu

导入javax。挥棒。jmenubar

导入javax。挥棒。jradiobuttonmenuitem

导入javax。挥棒。jscrollpane

导入javax。挥棒。jtable

导入javax。挥棒。listselectionmodel

导入javax。挥棒。桌子。表格列;

公共类调整宽度

{

JFrame jf=新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列sitem=new JCheckBoxMenuItem('选择列');

JCheckBoxMenuItem单元格sitem=new JCheckBoxMenuItem('选择单元格');

按钮组调整BG=新按钮组();

按钮组选择BG=新建按钮组();

//定义一个(同国际组织)国际组织类型的数组,用于保存表格所有的宽度调整方式

int[] adjustModes=new int[]{

JTable .自动调整大小关闭

JTable .自动调整下一列的大小,

JTable .AUTO _ RESIZE _ successive _ COLUMNS,

JTable .自动调整最后一列的大小,

JTable .自动调整所有列的大小

};

int[] selectModes=new int[]{

ListSelectionModel .多重间隔选择,

ListSelectionModel .单个区间选择,

ListSelectionModel .单项选择

};

JTable表;

//定义二维数组作为表格数据

对象[][]表数据=

{

新对象[]{ '李清照' , 29 , '女'},

新对象[]{ '苏格拉底', 56 , '男'},

新对象[]{ '李白', 35 , '男'},

新对象[]{ '弄玉', 18 , '女'},

新对象[]{ '虎头' , 2 , '男'}

};

//定义一维数据作为列标题

Object[] columnTitle={ '姓名' , '年龄' , '性别'};

公共void初始化()

{

//以二维数组和一维数组来创建一个JTable对象

table=new JTable(tableData,列标题);

//- 为窗口安装设置表格调整方式的菜单-

adjustModesItem[0]=新的JRadioButtonMenuItem('只调整表格');

adjustModesItem[1]=新的JRadioButtonMenuItem('只调整下一列');

adjustModesItem[2]=新的JRadioButtonMenuItem('平均调整余下列');

adjustModesItem[3]=新的JRadioButtonMenuItem('只调整最后一列');

adjustModesItem[4]=新的JRadioButtonMenuItem('平均调整所有列');

菜单栏。add(adjustModeMenu);

for(int I=0;i adjustModesItem.length我)

{

//默认选中第三个菜单项,即对应表格默认的宽度调整方式

如果(i==2)

{

adjustModesItem[i].set selected(真);

}

调整血糖。add(adjustModesItem[I]);

adjustmodemenu。add(adjustModesItem[I]);

final int index=I;

//为设置调整方式的菜单项添加监听器

adjustModesItem[i].addActionListener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

//如果当前菜单项处于选中状态,表格使用对应的调整方式

if (adjustModesItem[index].isSelected())

{

桌子。setautoresizemode(调整模式[索引]);

}

}

已执行的公共无效操作1(ActionEvent e){

//TODO自动生成的方法存根

}

});

}

//- 为窗口安装设置表格选择方式的菜单-

selectModesItem[0]=新的JRadioButtonMenuItem('无限制');

selectModesItem[1]=新的JRadioButtonMenuItem('单独的连续区');

selectModesItem[2]=新的JRadioButtonMenuItem('单选');

菜单栏。添加(选择模式菜单);

for(int I=0;我选择selectModesItem.length我)

{

//默认选中第一个菜单项,即对应表格默认的选择方式

如果(i==0)

{

selectModesItem[i].set selected(真);

}

选择bg。add(selectModesItem[I]);

选择模式菜单。add(selectModesItem[I]);

final int index=I;

//为设置选择方式的菜单项添加监听器

selectModesItem[i].addActionListener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

//如果当前菜单项处于选中状态,表格使用对应的选择方式

if (selectModesItem[index].isSelected())

{

table.getSelectionModel().setSelectionMode(选择模式[索引]);

}

}

});

}

菜单栏。add(selectUnitMenu);

//- 为窗口安装设置表格选择单元的菜单-

rowsitem。设置选定的(表格。getrowselectionallowed());

列sitem。设置选定的(表格。getcolumnselectionallowed());

手机网站。设置选定的(表格。getcellselectionenabled());

rowsItem.addActionListener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

桌子。清除选择();

//如果该菜单项处于选中状态,设置表格的选择单元是行

桌子。setrowselectionallowed(rowsitem。被选中());

//如果选择行、选择列同时被选中,其实质是选择单元格

手机网站。设置选定的(表格。getcellselectionenabled());

}

});

选择单位菜单。add(rowsItem);

columnsItem.addActionListener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

桌子。清除选择();

//如果该菜单项处于选中状态,设置表格的选择单元是列

桌子。setcolumnselectionallowed(列sitem。被选中());

//如果选择行、选择列同时被选中,其实质是选择单元格

手机网站。设置选定的(表格。getcellselectionenabled());

}

});

选择单位菜单。add(列sitem);

cellsItem.addActionListener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

桌子。清除选择();

//如果该菜单项处于选中状态,设置表格的选择单元是单元格

桌子。setcellselectionenabled(cell sitem。被选中());

//该选项的改变会同时影响选择行、选择列两个菜单

rowsitem。设置选定的(表格。getrowselectionallowed());

列sitem。设置选定的(表格。getcolumnselectionallowed());

}

});

选择单位菜单。add(cell sitem);

JF。setjmenubar(菜单栏);

//分别获取表格的三个表格列,并设置三列的最小宽度,最佳宽度和最大宽度

表列名column=table。getcolumn(列标题[0]);

名称列。setmin宽度(40);

表列年龄列=表。getcolumn(列标题[1]);

年龄栏。setpreferedwidth(50);

表列性别列=表。getcolumn(列标题[2]);

性别专栏。设置maxwidth(50);

//将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来

jf.add(新JScrollPane(table));

系统。出去。println(表。get model());

JF。pack();

JF。setdefaultcloseoperation(JFrame .EXIT _ ON _ CLOSE);

JF。设置可见(真);

}

公共静态void main(String[] args)

{

新调整宽度()。init();

}

}

运行效果:

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

示例3:

包awtDemo

导入Java。awt。borderlayout

导入Java。awt。事件。动作事件;

导入Java。awt。事件。动作监听器;

导入Java。util。ArrayList

导入javax。挥棒。jframe

导入javax。挥棒。jmenu

导入javax。挥棒。jmenubar

导入javax。挥棒。jmenuitem

导入javax。挥棒。jscrollpane

导入javax。挥棒。jtable

导入javax。挥棒。桌子。defaulttablemodel

导入javax。挥棒。桌子。表格列;

导入javax。挥棒。桌子。tablecolumnmodel

公共类TestDefaultTableModel

{

JFrame mainWin=new JFrame('管理数据行、数据列-www。jb51。net’);

final int COLUMN _ COUNT=5;

DefaultTableModel模型;

JTable表;

//用于保存被隐藏列的目录集合

ArrayList表列隐藏列=new ArrayList表列();

公共void初始化()

{

model=new DefaultTableModel(COLUMN _ COUNT,COLUMN _ COUNT);

for(int I=0;我列_计数;我)

{

for(int j=0;j列_计数;j)

{

model.setValueAt('老单元格值i ' ' j,I,j);

}

}

table=新的JTable(模型);

主胜。add(new JScrollPane(table),BorderLayout .中心);

//为窗口安装菜单

JMenuBar menuBar=new JMenuBar();

主胜。setjmenubar(菜单栏);

JMenu tableMenu=new JMenu('管理');

菜单栏。添加(表格菜单);

jmenu item hidecoolumnstitem=new jmenu item('隐藏选中列');

hidecolunstitem。addactionlistener(新的ActionListener()

{

公共void action performed 1(action event事件)

{

//获取所有选中列的索引

int[]selected=表。getselectedcolumns();

TableColumnModel columnModel=table。getcolumnmodel();

//依次把每一个选中的列隐藏起来,并使用目录把这些列保存起来

for(int I=selected。长度-1;I=0;我-)

{

表列column=列模型。getcolumn(selected[I]);

桌子。删除列(column);

//把隐藏的列保存起来,确保以后可以显示出来

隐藏列。添加(列);

}

}

@覆盖

已执行公共无效操作(操作事件e){

//TODO自动生成的方法存根

}

});

餐桌菜单。add(hidecoolumnstitem);

jmenu item showcolumnstitem=new jmenu item(' .显示隐藏列');

showcolumnstitem。addactionlistener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

//把所有隐藏列依次显示出来

for(表列TC:隐藏列)

{

//依次把所有隐藏的列显示出来

桌子。添加列(TC);

}

//清空保存隐藏列的目录集合

隐藏列。clear();

}

});

餐桌菜单。add(showcolumnstitem);

JMenuItem add column item=new JMenuItem('插入选中列');

addcolumnitem。addactionlistener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

//获取所有选中列的索引

int[]selected=表。getselectedcolumns();

TableColumnModel columnModel=table。getcolumnmodel();

//依次把选中的列添加到JTable之后

for(int I=selected。长度-1;I=0;我-)

{

表列column=列模型。getcolumn(selected[I]);

table.addColumn(列);

}

}

});

餐桌菜单。add(addColumnItem);

JMenuItem addRowItem=new JMenuItem('增加行');

addRowItem.addActionListener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

//创建一个线数组作为新增行的内容

String[] newCells=新字符串[列计数];

for(int I=0;我新细胞。长度;我)

{

newCells[i]='新单元格值模型。getrowcount()" " I;

}

//向表格模型中新增一行。

模型。addrow(新单元格);

}

});

餐桌菜单。add(addRowItem);

JMenuItem removeRowsItem=new JMenuItem('删除选中行');

removerowsitem。addactionlistener(新的ActionListener()

{

已执行公共无效操作(操作事件事件)

{

//获取所有选中行

int[]selected=表。getselectedrows();

//依次删除所有选中行

for(int I=selected。长度-1;I=0;我-)

{

模型。移除行(选定的[I]);

}

}

});

餐桌菜单。add(removeRowsItem);

主胜。pack();

主胜。setdefaultcloseoperation(JFrame .EXIT _ ON _ CLOSE);

主胜。设置可见(真);

}

公共静态void main(String[] args)

{

新的TestDefaultTableModel().init();

}

}

运行效果:

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

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

示例4:

公共类TestTableCellRenderer

{

JFrame jf=新JFrame('使用单元格绘制器');

JTable表;

//定义二维数组作为表格数据

对象[][]表数据=

{

新对象[]{ '李清照' , 29 , '女,new ImageIcon('icon/3.gif '),true},

新对象[]{ '苏格拉底', 56 , '男,new ImageIcon('icon/1.gif '),false},

新对象[]{ '李白', 35 , '男,new ImageIcon('icon/4.gif '),true},

新对象[]{ '弄玉', 18 , '女,new ImageIcon('icon/2.gif '),true},

新对象[]{ '虎头' , 2 , '男,new ImageIcon('icon/5.gif '),true}

};

//定义一维数据作为列标题

String[] columnTitle={ '姓名' , '年龄' , '性别' , '主头像' , '是否中国人'};

公共void初始化()

{

//以二维数组和一维数组来创建一个扩展表格模型对象

ExtendedTableModel model=new ExtendedTableModel(列标题,表数据);

//以扩展表格模型来创建JTable

table=新的JTable(模型);

桌子。setrowselectionallowed(false);

桌子。setrowheight(40);

//获取第三列

表列最后一列=表。getcolumnmodel().getColumn(2);

//对第三列采用自定义的单元格绘制器

最后一栏。setcellrenderer(new GenderTableCellRenderer());

//将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来

jf.add(新JScrollPane(table));

JF。pack();

JF。setdefaultcloseoperation(JFrame .EXIT _ ON _ CLOSE);

JF。设置可见(真);

}

公共静态void main(String[] args)

{

新的TestTableCellRenderer().init();

}

}

类扩展表格模型扩展了DefaultTableModel

{

//重新提供一个构造器,该构造器的实现委托给DefaultTableModel父类

public ExtendedTableModel(String[]列名,Object[][]单元格)

{

超级(单元格,列名);

}

//重写getColumnClass方法,根据每列的第一个值来返回其真实的数据类型

公共类getColumnClass(int c)

{

返回getValueAt(0,c).getClass();

}

}

GenderTableCellRenderer类扩展JPanel实现TableCellRenderer

{

私有字符串单元格值

//定义图标的宽度和高度

final int ICON _ WIDTH=23

final int ICON _ HEIGHT=21

公共组件getTableCellRendererComponent(JTable表,对象值,

布尔值isSelected,布尔值hasFocus,int row,int column)

{

单元格值=(字符串)值;

//设置选中状态下绘制边框

如果(有焦点)

{

设置边框(用户界面管理器。获取边框('表格。focuscellhighlight border '));

}

其他

{

设置边框(空);

}

还这个;

}

//重写颜料方法,负责绘制该单元格内容

公共空白油漆(图形g)

{

//如果表格值为'男'或男性,则绘制一个男性图标

if (cellValue.equalsIgnoreCase('男)

| |单元格数值。equalsignorecase('男性'))

{

drawImage(g,new ImageIcon('icon/male.gif ').getImage());

}

//如果表格值为'女'或女性,则绘制一个女性图标

if (cellValue.equalsIgnoreCase('女)

| |单元格数值。equalsignorecase('女性'))

{

drawImage(g,new ImageIcon('icon/female.gif ').getImage());

}

}

//绘制图标的方法

私有void drawImage(图形g,图像Image)

{

g.drawImage(image,(getWidth() - ICON_WIDTH )/2

,(getHeight() - ICON_HEIGHT)/2,null);

}

}

我这里只是实现了每列不同的控件,大家还可以自定义一个表格每行每列都是不同的控件,那就要得到单元格再setCellRender。

更多关于Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)相关内容感兴趣的读者可查看本站专题: 《Java数据结构与算法教程》 、 《Java字符与字符串操作技巧总结》 、 《Java操作DOM节点技巧总结》 、 《Java文件与目录操作技巧汇总》 和《Java缓存操作技巧汇总》

希望本文所述对大家Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)程序设计有所帮助。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: