这篇文章主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。