【原创】TableViewer组件(十二)
上一篇 / 下一篇 2008-06-26 09:46:02 / 个人分类:Eclipse插件开发
TableViewer组件
ITPUB个人空间Cg
R*Z8o[i
JFace中提供了TableViewer组件,用TableViewer来表示表格。TableViewer 和TreeViewer类似,它也提供了内容提供器(IStructuredContentProvider)和标签提供器(ITableLabelProvider),用来组织表格的信息。
@\)N0Y(B9o9UF'\0TableViewer构建步骤
ITPUB个人空间2Q,xK9K!eV9c
TableViewer中主要通过内容提供器(IStructuredContentProvider)和标签提供器(ITable- LabelProvider)组织表中单元格的显示信息。TableViewer构建步骤如下。ITPUB个人空间C!X oPsB
1. 创建TableViewer对象,例如“tableViewer = new TableViewer(table);”,其中table是SWT中Table对象。
-W(p b|`@+}E-B02. 设定内容管理器,例如“tableViewer.setContentProvider(contentProvider);”。ITPUB个人空间Ac1Wz3tr(rl3fB
3. 设定标签提供器,例如“tableViewer.setLabelProvider(labelProvider);”。ITPUB个人空间|2kz9G6zzz`t,?
4. 设定TableViewer的输入数据,例如“tableViewer.setInput("root");”(用户可以通过输入数据构建表)。
!i
bW _ L2OO't0@0另外,用户可以添加排序器和过滤器对表格数据进行排序和过滤,后面将通过实例介绍排序器和过滤器。
~!J
g&@"Rm3@2fX`V0TableViewer内容提供器(IStructuredContentProvider)
ITPUB个人空间&g#R
wt+]3s0i(s,v k
TableViewer中的内容管理器比较简单,用户可以通过实现getElements返回表格的所有数据。
#EV3\~+i Pa0getElements定义为“public Object[] getElements(Object inputElement)”,返回Object[]对象数组,其中数组中每一个对象代表表格的一列。当TableViewer输入数据后,内容管理器将根据输入数据构造表格对象数据,如下代码所示。
5E@\'b.iNI1^0public Object[] getElements(Object inputElement) {
//通过输入的数据建表ITPUB个人空间8r3LP.}s&gjl.`
Vector v = (Vector) inputElement;ITPUB个人空间AA-L O\
b)G:p
return v.toArray();ITPUB个人空间sNQ
Vt)O4\j
}
2uI@{:YT,flq_0|0其中,输入数据inputElement为Vector类型的变量,通过“v.toArray();”返回对象数组。ITPUB个人空间%D XAO#|,t x
TableViewer标签提供器(ITableLabelProvider)
Kv*i;tmd@*m0TableViewer中的标签提供器主要负责每个单元格中文本和图标的显示。ITableLabelProvider接口要求实现getColumnText和getColumnImage两个主要的方法,getColumnText返回指定单元格的显示文本,getColumnImage返回指定单元格的显示图标,解释如下。
IOtF9Z}n#q01. getColumnText:此函数定义为“public String getColumnText(Object element, int columnIndex)”,其中element表示单元格所在行的对象,columnIndex表示单元格所在的列,返回显示的文本。如下代码返回Bug对象的某特定列的显示文本。
#ah {
Sn5F1W0 public String getColumnText(Object element, int columnIndex) {ITPUB个人空间4o/K3p[+^
Bug bug = (Bug) element;ITPUB个人空间f
A u7YE"d p5~7_
switch (columnIndex) {ITPUB个人空间8Y#M"`c
mbY(r
gBxV
case 0:
)|d3^;FrA4Z0 return bug.id;ITPUB个人空间.cv(rxtl
case 1:ITPUB个人空间*w/V+`5IO$Dy _
[?
return bug.summary;ITPUB个人空间/yqlH }%H;kn
h
case 2:ITPUB个人空间5@kkQ8C\V
return bug.assignedTo;ITPUB个人空间3s PUI
h*qi}
case 3:ITPUB个人空间aqAil'l
return bug.isSolved ? "YES" : "NO";
;E u%Phad8V(~V0 }
G\;pK@,f~4I&`m$~ R0 return null;
PB'ER+y0 }
)i @Q.Lk7V
g02. getColumnImage:此函数定义为“public Image getColumnImage(Object element, int columnIndex)”,其中element表示单元格所在行的对象,columnIndex表示单元格所在的列,返回此单元格的显示图标。如下代码返回Bug对象的某特定列的显示图标。
x HGN4o%NI0 public Image getColumnImage(Object element, int columnIndex) {ITPUB个人空间a*G4gJ1TVb"@&h K
if (columnIndex == 0)ITPUB个人空间\z]i;H R4S
return bugIcon;ITPUB个人空间e$W _eF3tc*L"`
return null;ITPUB个人空间;f9P0Ib ^xm
}ITPUB个人空间{0hA~ k9asp3J
从上面代码可以看出,只有第一列显示图标,其他列不显示图标。
ITPUB个人空间#FX$\x%q&SE
TableViewer实例
ITPUB个人空间pA(`Fm`Q1FD
本节的实例为一个Bug列表实例(BugTrackerTableViewer),程序的功能如下。
*`gR7v
K01. 在窗口中通过ToolBar建立工具栏,并通过ToolBarManager添加相应的Action到工具栏中。
mTuxVWL@02. 在表格中设置内容管理器和标签管理器。
\(y9^^[G/d03. 在表格的每一列添加排序器。当用户单击列头时,排序器将按列排序。排序器中主要通过compare方法比较两行(即两个对象)中的特定列单元格数据大小,返回比较后表格排列的顺序。ITPUB个人空间 s#]y^j8L;|
4. 通过工具栏的Action(actionShowUnsolvedOnly)添加或删除过滤器,过滤器将根据过滤条件选择出符合要求的行(即对象)。ITPUB个人空间6p I+fov;Lm*r
另外,程序中将在运行时加载上次存储的Bug列表,用户也可以保存当前的Bug列表,程序如例程1所示。ITPUB个人空间J!Tv"s]`6y'P
例程1 BugTrackerTableViewer.java
l0LK+s;E4eOM*x0 ITPUB个人空间z+Bg ls m
/**ITPUB个人空间#O9d,_[&On
* 为了节省篇幅,把所有的import类注释了ITPUB个人空间#y3iZ7p1R^|O0V7hr%X
* 读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类ITPUB个人空间IO:UC"H8K#j v ?
* */
W IsKlLpt0public class BugTrackerTableViewer {
ZM2~u,KC1D0 // 内部类Bug,代表一个BUG显示
%q+p
L/e8e
Q!{4P0 public static class Bug {
public String id;ITPUB个人空间b^5MpC@6^0Y X
public String summary;
9IE)[q8E3F0 public String assignedTo;ITPUB个人空间*d/i%zVLF E
B6b
public boolean isSolved;
public Bug(String id, String summary, String assignedTo,
F@s4B$R`0 boolean isSolved) {ITPUB个人空间 Bl)K4GY4g T {
this.id = id;
Q6u4Sb&lj1T0 this.summary = summary;ITPUB个人空间&IlFdV_S
Q
this.assignedTo = assignedTo;