JTable.docx
- 文档编号:10945139
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:42
- 大小:59.05KB
JTable.docx
《JTable.docx》由会员分享,可在线阅读,更多相关《JTable.docx(42页珍藏版)》请在冰豆网上搜索。
JTable
▪留言
利用JTable类,可以以表格的形式展示数据,可设置允许用户编辑数据。
JTable本身不拥有或者缓存数据;它只是数据的视图。
这里有一个放在滚动面板上的典型表格:
展示如何完成一些常见的表格相关的任务:
包括以下部分:
(1)创建一个简单的表格
(2)向容器添加表格
(3)改变每每一栏的宽度
(4)用户选择
(5)创建表格模型
(6)监听数据改变
(7)点燃数据改变事件
(8)概念:
编辑器和渲染器
(9)使用自定义渲染器
(10)为单元格指定提示工具
(11)为列头指定提示工具
(12)排序和过滤
(13)使用组合框作为编辑器
(14)使用其他编辑器
(15)使用编辑器验证用户的文本输入
(16)打印
(17)例子列表
(1)创建一个简单的表格
SimpleTableDemo.java中的表格在一个字符串数组中声明各个列名
Java代码
1String[]columnNames={"FirstName",
2"LastName",
3"Sport",
4"#ofYears",
5"Vegetarian"};
数据初始化并存储在二维数组:
Java代码
6Object[][]data={
7{"Kathy","Smith",
8"Snowboarding",newInteger(5),newBoolean(false)},
9{"John","Doe",
10"Rowing",newInteger(3),newBoolean(true)},
11{"Sue","Black",
12"Knitting",newInteger
(2),newBoolean(false)},
13{"Jane","White",
14"Speedreading",newInteger(20),newBoolean(true)},
15{"Joe","Brown",
16
17"Pool",newInteger(10),newBoolean(false)}
18};
接着表格使用这些数据和列名构造一个表格:
Java代码
19JTabletable=newJTable(data,columnNames);
有两个接收数据的JTable构造器:
▪JTable(Object[][]rowData,Object[]columnNames)
▪JTable(VectorrowData,VectorcolumNames)
这些构造函数的好处是容易实现,而缺点是:
▪他们自动设置每个单元格为可编辑
▪数据类型都视为一样的(字符串类型)。
例如,如果表格的一列有Boolean数据,表格用单选框来展示这个数据。
可是,如果你用上面两种构造,你的Boolean数据将显示为字符串,就像前面表格截图中的Vegetarian一列一样。
▪它们要求你把所有表格数据放入一个数组或者vector,这些数据结构可能不适合某些数据类型。
例如,如果你实体化一组数据库对象,比起拷贝所有值放入数组和vector,你可能仅仅想要直接查询这些对象的值。
如果你想避免这些限制,你需要实现你自己的表格模型,见“(5)创建表格模型”。
(2)向容器添加表格
这里有一段创建滚动面板作为表格容器的常规代码:
Java代码
20JScrollPanescrollPane=newJScrollPane(table);
21table.setFillsViewportHeight(true);
这两行代码实现了:
表格对象的引用作为JScrollPane构造函数的参数,创建一个容纳table的容器,table添加到容器中;JTable.setFillsViewportHeight方法设置了fillsViewportHeight属性。
当这个属性为true时,表格会占据容器整个高度,即便表格没有足够的行去使用这些垂直空间。
这使得表格更容易实现拖拉操作。
滚动面板自动把表格头放置在视窗的顶端。
当表格数据垂直滚动时,列名保持在视窗顶端可视。
如果你想要使用一个没有滚动面板的表格,你必须获得表格头组件,然后自己放置它,例如:
Java代码
22container.setLayout(newBorderLayout());
23container.add(table.getTableHeader(),BorderLayout.PAGE_START);
24container.add(table,BorderLayout.CENTER);
(3)改变每每一列的宽度
默认情况下,表格所有列等宽,切这些列自动填满整个表格的宽度。
当表格变宽或者变窄时(通常是用户调整包含表格的窗口大小),所有的列宽自动调整到适当宽度。
当用户通过拖动列头的右边界来调整某一列的宽度时,要么别的列的宽度会受到影响而改变,要么整个表格的宽度会改变。
默认情况下,表格整体宽度保持不变,“拖动点“的右侧各列利用增加或减少的空间自我调整,拖动的那一列的左侧各列保持不变。
要定义各列初始化宽度,你可以对表格各列调用setPreferredWidth方法。
可以设置各列首选宽度,和他们的相对宽度。
例如,向demo增加下面代码,是的第三列比其他列更宽:
Java代码
25TableColumncolumn=null;
26for(inti=0;i<5;i++){
27column=table.getColumnModel().getColumn(i);
28if(i==2){
29column.setPreferredWidth(100);//thirdcolumnisbigger
30}else{
31column.setPreferredWidth(50);
32}
33}
如上面代码所示,每一列代表一个TableColumn对象,TableColumn提供getter和setter方法设置和获取列的最小、首选、最大宽度和目前宽度。
基于估计单元格内容需要的空间调整单元格宽度,查看TableRenderDemo.java.中的initColumnSizes方法。
当用户明确的调整列宽度,列的”首选宽度“就被设置为用户指定的”新的当前宽度“。
不过,当表格因视窗调整而改变大小是,列的”首选宽度“不会改变。
”首选宽度“的存在是用于计算新的列的宽度,来填充可用空间。
你可以通过调用setAutoResizeMode改变一个表格的调整模式。
(4)用户选择
默认配置情况下,一个表格支持选择一行或多行。
用户可以选择一组连续的或不连续的行。
用户最后指示的那个单元格,在Metal样式中,会被outlined(轮廓虚线)。
这个单元格被称为”leadselection“(导联选择(器,钮));有时候也称为”聚焦单元格“或”当前单元格“。
用户使用鼠标键盘实现选择,选择的方式描述如下
操作
鼠标动作
键盘动作
选择单行
点击
向上或向下
选中连续多行
Shift—点击/拖拉
Shitf-向上或Shift-向下
向选中的行集增加行/切换选择
Control-点击
Control+向上或向下,使用空格键增加当前行或切换选择.
下面的例子程序TableSelectionDemo.java展示了类似的表格,允许用户操纵某些JTable选项。
还有一个文本面板记录”选择事件“。
(这个demo里面的有关复选框事件处理代码写的好好)
在下面的截图中,这事默认的Metal样式,选中的行highlight,选择的单元格outline
在下面的”SelectionMode“下,有一些复选框,选择”SingleSelection“。
现在你只能在某一时刻选中一行,如果你选中”SingleIntervalSelection“,你可以选择连续的多行。
所有的”SelectionMode“下面的复选框按钮,调用JTable.setSelectionMode.这个方法带一个参数,为javax.swing.ListSelectionModel:
MULTIPLE_INTERVAL_SELECTION,SINGLE_INTERVAL_SELECTION,andSINGLE_SELECTION.中的一个(依次为,多行可间隔,多行无间隔,单行)
回到我们的demo,注意,在”SelectionOptions“下三个复选框,每个复选框控制一个由JTable定义的绑定属性的boolean类型状态值:
▪”RowSelection“控制控制rowSelectionAllowed属性,通过setRowSelectionAllowed和getRowSelectionAllowed设置和读取。
当这个绑定属性为true(同时columnSelectionAllowed属性为false)时,用户可以选择行。
▪”CoolumnSelection“控制columnSelectionAllowed属性,通过setColumnSelectionAllowed和getColumnSelectionAllowed设置和读取。
当这个绑定属性为true时,用户可以选择单个单元格,或者呈矩阵块地选择多个单元格
▪”CellSelection“控制cellSelectionEnabled,通过setCellSelectionEnabledandgetCellSelectionEnabled设置和获取。
当这个绑定属性为true是,用户可以选择单个单元格,或是以矩阵块的形式选择多个单元格。
提醒:
JTable使用很简单的选择原则来管理行和列的交集,它并非设计成全面处理独立的单元格选择。
(就是说,有些多单元格的选择是不被handle的,你也选不到)
如果你清空三个复选框,就没有selection了,只有leadselection表现而已。
(我觉得leadselection只是形式上的选择,是一种导航观察的形式,而selection是确切选中表格中某些单元格的事实。
我无法确切地解释出leadselection和selection的区别,我只能意会呀)
你可能注意到”CellSelection“复选框在”multipleintervalselection“选择模式中是不可用的。
只是在这个demo的模式中是不被支持的。
你可以在”multipleintervalselection“模式中指定单元格选择,但是表格也不会产生有效的selection。
你或许还注意到,改变这”selectionoption“中某个选项可能影响其他选项。
这是因为允许行选择和列选择,就意味着允许单元格原则。
JTable自动更新三个绑定属性,以保持它们的一致性。
提醒:
设置cellSelectionEnabled的值会附带同时设置rowSelectionEnabled和columnSelectionEnabled的效果。
同样,设置后两者的值同样会影响cellSelectionEnabled的值。
设置row……和cloumn……为不同值,同时设置cell……为false,可以测试一下。
要获得当前的selection,使用JTable.getSelectedRows,返回一个带索引行数的数组,使用JTable.getSelectedColumns返回列索引。
要获得leadselection的坐标,需要引用table本身的selectionmodel和table的columnmodel。
下面代码格式化一个包含一个leadselection的行和列的字符串:
Java代码
34String.format("LeadSelection:
%d,%d.",
35table.getSelectionModel().getLeadSelectionIndex(),
36table.getColumnModel().getSelectionModel().getLeadSelectionIndex());
使用selections产生一些时间。
参考HowtoWriteaListSelectionListenerintheWritingEventListeners
(5)创建表格模型
每个table对象使用一个tablemodel对象来管理表格中真实的数据。
一个tablemodel对象一定要实现TableModel接口,如果程序没有提供一个tablemodel对象,JTable自动创建一个DefaultTableModel实例。
这种关系可用下面的图来解释
SimpleTableDemo中JTable的构造器如下面代码一样,创建它的tablemodel:
Java代码
37newAbstractTableModel(){
38publicStringgetColumnName(intcol){
39returncolumnNames[col].toString();
40}
41publicintgetRowCount(){returnrowData.length;}
42publicintgetColumnCount(){returncolumnNames.length;}
43publicObjectgetValueAt(introw,intcol){
44returnrowData[row][col];
45}
46publicbooleanisCellEditable(introw,intcol)
47{returntrue;}
48publicvoidsetValueAt(Objectvalue,introw,intcol){
49rowData[row][col]=value;
50fireTableCellUpdated(row,col);
51}
52}
上面代码,简单的实现了一个tablemodel。
通常在AbstractTableModel的子类中实现tablemodel。
你的模型可以支持数组、vector或hashmap类型的数据。
甚至是从外资资源,如数据库中获得数据。
他甚至可以在运行期间产生数据。
这个TableDemo.java例子中的表格与前面SimpleTableDemo中的表格有几点区别:
▪TableDemo的自定义tablemodel,即便它很简单,不过他可以轻松地确定数据的类型,帮助JTable用最好的格式展示数据。
SimpleTableDemo自动创建的tablemodel,并不知道#ofYears一栏包括数字(需要右对齐且特殊格式),也不知道Vegetarian一栏包含用单选框表示的布尔值。
▪在TableDemo中实现的tablemodel并不是让你编辑那些表示姓名的栏目,而是修改其他栏。
在SimpleTableDemo中,所有单元格都是可编辑的。
观察TableDemo.java的代码,粗体部分是区别于SimpleTableDemo自动创建的tablemodel:
Java代码
53publicTableDemo(){
54...
55JTabletable=newJTable(newMyTableModel());
56...
57}
58
59classMyTableModelextendsAbstractTableModel{
60privateString[]columnNames=...//sameasbefore...
61privateObject[][]data=...//sameasbefore...
62
63publicintgetColumnCount(){
64returncolumnNames.length;
65}
66
67publicintgetRowCount(){
68returndata.length;
69}
70
71publicStringgetColumnName(intcol){
72returncolumnNames[col];
73}
74
75publicObjectgetValueAt(introw,intcol){
76returndata[row][col];
77}
78
79publicClassgetColumnClass(intc){
80returngetValueAt(0,c).getClass();
81}
82
83
84
85
86/*
87*Don'tneedtoimplementthismethodunlessyourtable's
88*editable.
89*/
90publicbooleanisCellEditable(introw,intcol){
91//Notethatthedata/celladdressisconstant,
92//nomatterwherethecellappearsonscreen.
93if(col<2){
94returnfalse;
95}else{
96returntrue;
97}
98
99
100
101}
102
103/*
104*Don'tneedtoimplementthismethodunlessyourtable's
105*datacanchange.
106*/
107publicvoidsetValueAt(Objectvalue,introw,intcol){
108data[row][col]=value;
109fireTableCellUpdated(row,col);
110}
111...
112}
(6)监听数据改变
一个tablemodel可以有多个监听器,无论何时,只要表格数据被改变,都会通知这些监听器。
监听器是TableModelListener类的实例。
在下面的例子代码中,SimpleTableDemo增加了一个监听器,粗体部分是新的代码:
Java代码
113importjavax.swing.event.*;
114importjavax.swing.table.TableModel;
115
116
117
118
119publicclassSimpleTableDemo...implementsTableModelListener
120
121
122{
123...
124publicSimpleTableDemo(){
125...
126table.getModel().addTableModelListener(this);
127
128
129...
130}
131
132publicvoidtableChanged(TableModelEvente){
133introw=e.getFirstRow();
134intcolumn=e.getColumn();
135TableModelmodel=(TableModel)e.getSource();
136StringcolumnName=model.getColumnName(column);
137Objectdata=model.getValueAt(row,column);
138
139...//Dosomethingwiththedata...
140}
141
142
143...
144}
(7)点燃数据改变事件
为了唤醒数据改变事件,tablemodel一定要知道如果构造TableModelEvent对象。
这是个复杂的过程,但是已经在DefaultTableModel中实现了。
你可以让JTable使用他自己默认的DefaultTableModel实例,或者创建自定义的DefaultTableModel子类。
如果DefaultTableModel不适合作为自定义tablemodel类的基类,考虑使用AbstractTableModel作为基类。
这个类实现了构造TableModelEvent对象的简单框架。
(DefaultTableModel是该抽象类的子类)当外界改变了表格数据的时候,你的自定义类仅仅需要调用AbstractTableModel方法中的一个,如下:
MethodChange
fireTableCellUpdated
Updateofspecifiedcell.单元格更新
fireTableRowsUpdated
Updateofspecifiedrows行更新
fireTableDataChanged
Updateofentiretable(dataonly).表格范围内的数据更新
fireTableRowsInserted
Newrowsinserted.插入新行
fireTableRowsDeleted
ExistingrowsDeleted删除存在的行
fireTableStructureChanged
Invalidateent
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JTable