swing中Jtable使用的方法.docx

上传人:b****6 文档编号:6620763 上传时间:2023-01-08 格式:DOCX 页数:30 大小:39.16KB
下载 相关 举报
swing中Jtable使用的方法.docx_第1页
第1页 / 共30页
swing中Jtable使用的方法.docx_第2页
第2页 / 共30页
swing中Jtable使用的方法.docx_第3页
第3页 / 共30页
swing中Jtable使用的方法.docx_第4页
第4页 / 共30页
swing中Jtable使用的方法.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

swing中Jtable使用的方法.docx

《swing中Jtable使用的方法.docx》由会员分享,可在线阅读,更多相关《swing中Jtable使用的方法.docx(30页珍藏版)》请在冰豆网上搜索。

swing中Jtable使用的方法.docx

swing中Jtable使用的方法

如何使用Table

利用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方法中的一个,如下:

MethodChangefireTableCellUpdated

Updateofspecifiedcell.单元格更新

fireTableRowsUpdated

Updateofspecifiedrows行更新

fireTableDataChanged

Updateofentiretable(dataonly).表格范围内的数据更新

fireTableRowsInserted

Newrowsinserted.插入新行

fireTableRowsDeleted

ExistingrowsDeleted删除存在的行

fireTableStructureChanged

Invalidat

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1