【原创】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!XoPsB
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个人空间|2k z9G6zzz`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-LO\ b)G:p
 return v.toArray();ITPUB个人空间sNQ Vt)O4\j
}
2u I@{: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 Au7YE"d p5~7_
    switch (columnIndex) {ITPUB个人空间8Y#M"`c mbY(r g Bx V
    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@k kQ8C\V
     return bug.assignedTo;ITPUB个人空间3sPUI h*q i}
    case 3:ITPUB个人空间aqAil'l
     return bug.isSolved ? "YES" : "NO";
;Eu%Pha d8V(~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 HG N4o%NI0   public Image getColumnImage(Object element, int columnIndex) {ITPUB个人空间a*G4gJ1T Vb"@&h K
    if (columnIndex == 0)ITPUB个人空间\z]i;HR4S
     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到工具栏中。
mTux VWL@02.  在表格中设置内容管理器和标签管理器。
\(y9^^[G/d03.  在表格的每一列添加排序器。当用户单击列头时,排序器将按列排序。排序器中主要通过compare方法比较两行(即两个对象)中的特定列单元格数据大小,返回比较后表格排列的顺序。ITPUB个人空间s#] y^ j8L;|
4.  通过工具栏的Action(actionShowUnsolvedOnly)添加或删除过滤器,过滤器将根据过滤条件选择出符合要求的行(即对象)。ITPUB个人空间6pI+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:U C"H8K#j v ?
 * */
WIsKl Lpt0public class BugTrackerTableViewer {
ZM2~u,K C1D0 // 内部类Bug,代表一个BUG显示
%q+p L/e8e Q!{4P0 public static class Bug {

  public String id;ITPUB个人空间b^5Mp C@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)K4GY4gT{
   this.id = id;
Q6u4Sb&lj1T0   this.summary = summary;ITPUB个人空间&Il FdV_ S Q
   this.assignedTo = assignedTo;
F/p6s4Iy @c)^0   this.isSolved = isSolved;
|2y$H@kB"R7r1^0  }

  public static Vector loadBugs(File file) {
(z1F'KA+wcjZ0   Vector v = new Vector();

   DataInputStream in = null;

   try {ITPUB个人空间Y"_ M f4J,l$| Q\u
    if (!file.exists())
{8x \;jP0     return v;ITPUB个人空间6Xplq&n7n&V#U-T8B
    in = new DataInputStream(new FileInputStream(file));

    while (true) {
BF&yP[X `1X0     String id = in.readUTF();
eG:M4ST,]0     String summary = in.readUTF();
L I[*c]}g%q8?0     String assignedTo = in.readUTF();ITPUB个人空间(ul&|g4zwT
     boolean solved = in.readBoolean();
S3os.W7S`0     v.add(new Bug(id, summary, assignedTo, solved));
'{*a!o&WK0    }
3]ia:G#d5Oc-g.k0   } catch (IOException ioe) {

   } finally {ITPUB个人空间 ^s?yEU9W dnV!?
    try {
O$^f vy-|0Y$P D5z0     if (in != null)
@kQc@(u!u9Z5K0      in.close();
zN)} w;E`5z#sAL0p0    } catch (IOException e) {
+p![gyx0     e.printStackTrace();
Q*]qJ-r0    }
P8D$Cz]{)L.}!_0   }ITPUB个人空间u7]:k5w1@9ZW#sWD D
   return v;
'z@'mrq+T-{z;SB+LB v0  }ITPUB个人空间:Dx8g*q+b6aCl&Y
 }

 Display display = new Display();ITPUB个人空间p)VjO b;s@fN&j
 Shell shell = new Shell(display);
%a#Z5e in0 Table table;
h6}0eZ5j;cm0 TableViewer tableViewer;ITPUB个人空间1C!a'u3i$`XBZA M
 Vector bugs;

 /**
2K w;SN1T1rM.fDl O.U9R0  * 读者可以通过图片创建自己的Image 例如:Image bugIcon = new Image(shell.getDisplay(),ITPUB个人空间_ |b6~9WZt*R
  * "icons/mybug.gif");ITPUB个人空间l pUU q
  */ITPUB个人空间UV'm&CAf)LWo$g
 Image bugIcon = WorkbenchImagesITPUB个人空间F l*il3G~;~Z,`
   .getImage(IWorkbenchGraphicConstants.IMG_OBJ_SIGNED_YES);

 String[] colNames = new String[] { "ID", "Summary", "Assigned to", "Solved" };

 // 实现表格的排序器
/n:[}9UsK e [l0 class BugSorter extends ViewerSorter {
(Nd%s~]8JM8V0  private String property;ITPUB个人空间'YCqP rFE8h}
  private int propertyIndex;

  public BugSorter(String sortByProperty) {
u WF-^9zP$B|Geyv0   for (int i = 0; i < colNames.length; i++) {ITPUB个人空间+V!s)`6A.B gQ%wU
    if (colNames[i].equals(sortByProperty)) {ITPUB个人空间%I!@7SAhb9`U
     this.property = sortByProperty;ITPUB个人空间'T@K;jb`
     this.propertyIndex = i;
,C"F'C}B C g0     return;ITPUB个人空间/o] M6T[1Hg8{m
    }ITPUB个人空间4}e2F G6[.Zq%vD9b
   }
O8{ij0B u}sL \0   throw new IllegalArgumentException("Unrecognized property: "ITPUB个人空间"_8q dS hX]6m|Y
     + sortByProperty);
"F*D^4}zP_Bi6c0  }

  // 比较e1和e2的大小ITPUB个人空间 I6m3p.dDD;o#z(mDA7va
  public int compare(Viewer viewer, Object e1, Object e2) {
2tW%~/e4`f3l+t0   Bug bug1 = (Bug) e1;ITPUB个人空间vq&rb?
   Bug bug2 = (Bug) e2;ITPUB个人空间^Z De~!c$t r
   switch (propertyIndex) {
:z GR\g"i7I&i#r hw0   case 0:
.M*t zip0L f"Gn*}.{+T0    return bug1.id.compareTo(bug2.id);
cf7n!H;f"VzZ0   case 1:
~Xt8YMc0    return bug1.summary.compareTo(bug2.summary);
.xyWP*i&[A4_:Lr0   case 2:
}}Q m&YrQx0    return bug1.assignedTo.compareTo(bug2.assignedTo);
caI{D0   case 3:ITPUB个人空间AAzkX
    if (bug1.isSolved == bug2.isSolved)
GRsML.r.EEL0     return 0;ITPUB个人空间2k_'dw} IR4[
    if (bug1.isSolved)
&{'jpy*_ x0     return 1;
!e&x#H$t#J4iOM(~0    else
+H]X%q [w5n0     return -1;ITPUB个人空间~UltE }
   default:ITPUB个人空间XcD,R/_%n8eC
    return 0;
"F:`[7Q}vlg0   }
:v"B#cdsX|*N1?v*~U0  }

 }

 public BugTrackerTableViewer() {
4S^Lc7w8Y3`f y0  // 添加工具栏的相应Action
f`wdP(j@&Y0  // 添加新建按钮的Action
&_p7C5b} W:SE0  Action actionAddNew = new Action("New bug") {ITPUB个人空间*M5j3}'x/T,b A
   public void run() {
N6B*hLJ6LB0    // Append.
*V'O,b&Y9rF8j0    Bug bug = new Bug("", "", "", false);
*T+Sd-x]+UaE0    bugs.add(bug);ITPUB个人空间\5I9Lp$qK m le.w6X
    tableViewer.refresh(false);
?,C*K|~jp)}i0   }
vZCY"PG%c0  };

  Action actionDelete = new Action("Delete selected") {ITPUB个人空间t'fu6b7F3winB
   public void run() {
2Kc#B9@e7])Xn9m0    IStructuredSelection selection = (IStructuredSelection) tableViewer
gC'];c AD3E0      .getSelection();
r&A7hfzp K0    Bug bug = (Bug) selection.getFirstElement();
-SE ?M0y0    if (bug == null) {ITPUB个人空间l d-C ` u X
     System.out.println("Please select an item first. ");ITPUB个人空间V7A&?M*_0f3VmM
     return;ITPUB个人空间2^ V&KS}+V"~(G2t
    }
x(S_ IT-F%V0    MessageBox messageBox = new MessageBox(shell, SWT.YES | SWT.NO);
,ME:`6n2g.Vu:LB0    messageBox.setText("Confirmation");
~D,v[6H:R$y0    messageBox
t?8mCNb x S%J0      .setMessage("Are you sure to remove the bug with id #"
NIZ5Zl0        + bug.id);
f:Sk9yw(BW&Iz0    if (messageBox.open() == SWT.YES) {
8z$j!`,^i+o:d6qy)cz0     bugs.remove(bug);
xq.|i2~P"EB0     tableViewer.refresh(false);ITPUB个人空间T'z Qix'A
    }
"Y&RJ LY5q0   }ITPUB个人空间\dP)XL
  };

  Action actionSave = new Action("Save") {
m.e^ ?7afk0   public void run() {
$g)}C7wji0    saveBugs(bugs);ITPUB个人空间 r]vFb8w
   }
p?k.RrX#|B6op0  };
8]?$L K,y*gM8[@(K S0  // 添加表的过滤器ITPUB个人空间;~Tt4[(S*^A
  final ViewerFilter filter = new ViewerFilter() {ITPUB个人空间)^#GI(Nh5i-jk
   public boolean select(Viewer viewer, Object parentElement,ITPUB个人空间0UC3r o*gpZu+B+Q
     Object element) {ITPUB个人空间gy%[ BN1tu
    if (!((Bug) element).isSolved)
M QxY7}(Q |;K2ZB0     return true;
*Na+wY3U_-]a0    return false;ITPUB个人空间*WG'G5q9Wp$R0S,H#b
   }ITPUB个人空间:q0IPo3d'ZF
  };
K1CC1{f y6O:G9M }0  Action actionShowUnsolvedOnly = new Action("Show unsolved only") {ITPUB个人空间Uz8P7h)@/M8k
   public void run() {
%?{^V/A7Wt0    if (!isChecked())
;r$lBC&g IV(k]0     tableViewer.removeFilter(filter);ITPUB个人空间@ BY8Vr l
    elseITPUB个人空间/UF'B9j-Z_0zKt-]5D
     tableViewer.addFilter(filter);ITPUB个人空间X3@*?K M#Dg
   }ITPUB个人空间7Y)L7xm x-E
  };ITPUB个人空间}'ZKR1r0Y+y;Lb Gv
  actionShowUnsolvedOnly.setChecked(false);

  ToolBar toolBar = new ToolBar(shell, SWT.RIGHT | SWT.FLAT);

  ToolBarManager manager = new ToolBarManager(toolBar);ITPUB个人空间(`\-]3~+BO*c$HD*S
  // 添加工具项,并把工具项关联到相应的ActionITPUB个人空间L H_B)Kc1jg
  manager.add(actionAddNew);
1@ZUJ t? M0  manager.add(actionDelete);ITPUB个人空间:i#E_,Ui \
  manager.add(new Separator());ITPUB个人空间DfV@6\R
  manager.add(actionSave);
7~GNmK.U} s D1d0  manager.add(new Separator());
f4L~X*Y R%qa0  manager.add(actionShowUnsolvedOnly);
5o^%]#Noe:{O0  manager.update(true);
gy,[ aOm0  shell.setLayout(new GridLayout());ITPUB个人空间1s%hl3r;`4{Z3W
  table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);

  TableColumn tcID = new TableColumn(table, SWT.LEFT);
T2Nv uoZ7e0  tcID.setText(colNames[0]);

  TableColumn tcSummary = new TableColumn(table, SWT.NULL);
#MOA2Pib$O'Q&k r0  tcSummary.setText(colNames[1]);

  TableColumn tcAssignedTo = new TableColumn(table, SWT.NULL);
nN/i4[n ~D,UR,L0  tcAssignedTo.setText(colNames[2]);

  TableColumn tcSolved = new TableColumn(table, SWT.NULL);ITPUB个人空间mw%R}X7O;W
  tcSolved.setText(colNames[3]);

  tcID.setWidth(60);
H0Q8~2m3p;_0  tcSummary.setWidth(200);
2s_:A4q m+gH0  tcAssignedTo.setWidth(80);
W'm.I;?2C)Si2KF0  tcSolved.setWidth(50);
f_0XP(?0  tableViewer = new TableViewer(table);ITPUB个人空间JN2{ ];R9F
  tableViewer.getTable().setLinesVisible(true);
9[o-Wk.u1E0  tableViewer.getTable().setHeaderVisible(true);ITPUB个人空间n%HU @I8A
  tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
@ND3V$Lio0  // 设定表的内容管理器ITPUB个人空间HV3U(]_#r"L
  tableViewer.setContentProvider(new IStructuredContentProvider() {ITPUB个人空间,K/BA&C Wd3G
   // 获得所有对象ITPUB个人空间5}e`B v;Dh6n0u
   public Object[] getElements(Object inputElement) {

    // 通过输入的数据建表ITPUB个人空间v ml \M} ]p
    Vector v = (Vector) inputElement;ITPUB个人空间?Q-[x8hU"X$xn
    return v.toArray();ITPUB个人空间0|CjkkW(u
   }

   public void dispose() {ITPUB个人空间f1GT2p%_%Ui:L U*d~,X%@
    System.out.println("Disposing ...");
0nIB-TE's{ c0   }

   public void inputChanged(Viewer viewer, Object oldInput,ITPUB个人空间 TC%A {Z*~6A
     Object newInput) {
"` Fl C{+smY3K0    System.out.println("Input changed: ld=" + oldInput + ", new="ITPUB个人空间b1T-NEy7[i:J9F#X-b
      + newInput);ITPUB个人空间d2z7]\qW%N0g
   }
qY#jf6]0  });ITPUB个人空间Ss'K,M.|u
  // 设定表的标签管理器ITPUB个人空间:d2z2CO UQ;q-u)z1J6U
  tableViewer.setLabelProvider(new ITableLabelProvider() {
1e j!S O;FH9J0   public Image getColumnImage(Object element, int columnIndex) {
(TA$[:`!S GBEL%|f0    if (columnIndex == 0)
9oQ~0[i:B$R0     return bugIcon;ITPUB个人空间6O'KTD4D*Y*j\
    return null;ITPUB个人空间'{'K~7m ga
   }

   // 获得列的显示文本
x2gK}3DfX%J0   public String getColumnText(Object element, int columnIndex) {ITPUB个人空间HD"S |Z7x0G.q
    Bug bug = (Bug) element;
"{Q$z ^9R?!C0    switch (columnIndex) {
f!_ E8l8l k0    case 0:ITPUB个人空间mCvz Fw byd
     return bug.id;
S|{T.T/B0    case 1:
$D EQ` V0     return bug.summary;ITPUB个人空间.TYd*X)T
    case 2:ITPUB个人空间#J:p2m T7r#X H
     return bug.assignedTo;
*{4ZA0x+W$ff1Z#d0    case 3:
9~P5Kh*AS*Y zI%?0     return bug.isSolved ? "YES" : "NO";
Ws3i.^f%e.X0    }ITPUB个人空间]&ZgK/z:Xta
    return null;ITPUB个人空间q\WS-B I"kp2F }LH
   }

   public void addListener(ILabelProviderListener listener) {
GFc*E5y^9J0   }

   public void dispose() {ITPUB个人空间9k#fBK5fYu{
   }

   public boolean isLabelProperty(Object element, String property) {ITPUB个人空间.\.S4~lxab$~H'S
    return false;ITPUB个人空间EXn2c:u)yS
   }

   public void removeListener(ILabelProviderListener listener) {
$zq?r9\0   }
T'@"e"mr:\/p%y0  });ITPUB个人空间_lW5{0P"v7h1]
  // 设定单元格编辑器ITPUB个人空间s ] JnO
  tableViewer.setColumnProperties(colNames);ITPUB个人空间Y;z/dxr~$g9M
  CellEditor[] cellEditors = new CellEditor[4];
'{ s Or;}2RC0  cellEditors[0] = new TextCellEditor(table);ITPUB个人空间'\dcMN)ol2wnE_#[%D3r
  cellEditors[1] = cellEditors[0];
Jfw&L;[F fV0  cellEditors[2] = cellEditors[0];ITPUB个人空间 K],m#N'Mq D
  cellEditors[3] = new CheckboxCellEditor(table);ITPUB个人空间/d5k%~` uJK bD gm
  tableViewer.setCellEditors(cellEditors);ITPUB个人空间 U Vg-["KW*D
  // 设定单元格修改器
v0q&}s6vfzmTc0  tableViewer.setCellModifier(new ICellModifier() {
x aAr0W b~R%F3b0   public boolean canModify(Object element, String property) {ITPUB个人空间Bn9HrQ3a H R
    return true;
`a'h7u*K#a`\8E!^0   }

   public Object getValue(Object element, String property) {
V0D A%{+Dj:|,zUQ0    int index = -1;
&jc6v!tyu)[EC/m0    for (int i = 0; i < colNames.length; i++) {
L {pZ-^0     if (colNames[i].equals(property)) {ITPUB个人空间7z&K!V8]@M E
      index = i;ITPUB个人空间#aG q9Rd
      break;ITPUB个人空间]TPP{ z%aFkn
     }
-yKl9d S0    }
/W$?SL/^}1H-Uf+_0    Bug bug = (Bug) element;
/^QI/f M0    switch (index) {ITPUB个人空间"J ^2[#dU1i
    case 0:ITPUB个人空间\%Q;rPO+V
     return bug.id;
i B }T2KJ~(nj`0    case 1:
2i7m&j&of_h)h&e0     return bug.summary;ITPUB个人空间Q2A/QOwmN
    case 2:
N3]-^ Jc;RI*R0     return bug.assignedTo;
9{l.la[JS?#j0    case 3:
!r*uz9Axm0     return new Boolean(bug.isSolved);ITPUB个人空间 h:RI7m*zs2p+p ^v2D
    }
gNdl*L8E']K0    return null;ITPUB个人空间^T`*i5K!w_9mB
   }

   public void modify(Object element, String property, Object value) {ITPUB个人空间B,Z$P~&l'^6|9D
    System.out.println("Modify: " + element + ", " + propertyITPUB个人空间5~p#z4iW#C8RMV
      + ", " + value);

    int index = -1;
$d|H7hd0    for (int i = 0; i < colNames.length; i++) {ITPUB个人空间'}~"z K/F/L6t
     if (colNames[i].equals(property)) {ITPUB个人空间(Ju.c1`m5e
      index = i;ITPUB个人空间(sZ/`;P3K1Ek,C\r+~
      break;ITPUB个人空间:wTSk'S cTF!w
     }
GGYc4k0    }
LOR&jBxK2[0    Bug bug = null;
3e/T H q,e)Zn3D8`GF0    if (element instanceof Item) {
1rx|j-j eYk"?0     TableItem item = (TableItem) element;ITPUB个人空间0z$TGV+xC+fy
     bug = (Bug) item.getData();
x rl Iju j h-P|0    } else {
8Ad*U3s2rG%Y*i y0     bug = (Bug) element;ITPUB个人空间'f%dV^wL S0nP k
    }
'G\.m Zh3_,pj0    switch (index) {
C7f u;wgZ&w0    case 0:
,M_8L7cg0     bug.id = (String) value;
HlW-c2o vG0     break;
%XS;C wC2tK,uv&V0    case 1:
c ]"@~s7x0     bug.summary = (String) value;
9vH6D:b]vc0     break;
ewu cQ$Q0    case 2:ITPUB个人空间n pP@k ZEX
     bug.assignedTo = (String) value;
jB)vx'agum0     break;
(?eWz X `+xdFj g0    case 3:
`A+I^7j}0     bug.isSolved = ((Boolean) value).booleanValue();
{#qJ2c3]0     break;
%Z$W m)u7r0d0    }ITPUB个人空间U,f[*Ki
    tableViewer.update(bug, null);
~D(@#wB n s,y/H0   }
n*xX r#S0  });ITPUB个人空间Z,\'XY4y{9e2m
  // 设定表格的排序方式
xcc9vZe(Y(W0  // 单击第一列列头按第一列排序
W/?q_W#oc"` m0  tcID.addListener(SWT.Selection, new Listener() {
4Y@Ce8rS0   public void handleEvent(Event event) {ITPUB个人空间'eV9Z)G2y:@(O D;}
    tableViewer.setSorter(new BugSorter(colNames[0]));ITPUB个人空间9F'pnL1Z SX
   }
QAMn.RWx0  });
`'v:V j y |S0  // 单击第二列列头按第二列排序ITPUB个人空间8FokGL8o i#o/X
  tcSummary.addListener(SWT.Selection, new Listener() {ITPUB个人空间!@W)VxMWC
   public void handleEvent(Event event) {ITPUB个人空间VE*LGp V;y
    tableViewer.setSorter(new BugSorter(colNames[1]));ITPUB个人空间XR Gx}*c
   }
/x)zr9[9N8s5l4t4}:i0  });ITPUB个人空间 AN.Mv `'G
  // 单击第三列列头按第三列排序
jK7S+Gz0  tcAssignedTo.addListener(SWT.Selection, new Listener() {
HV$t+_Y1t0   public void handleEvent(Event event) {
Hh8@#?-F&v*v0    tableViewer.setSorter(new BugSorter(colNames[2]));ITPUB个人空间%q+z&X/A^"V2{t
   }ITPUB个人空间"oYL,i5f}B8l(Hm
  });ITPUB个人空间0N'bgf+Bz+V$\P
  // 单击第四列列头按第四列排序ITPUB个人空间&B_ A9`W
  tcSolved.addListener(SWT.Selection, new Listener() {
?\E!J:X7`%L!s2Y1S#a0   public void handleEvent(Event event) {
.G1SD }H/U`$R0    tableViewer.setSorter(new BugSorter(colNames[3]));ITPUB个人空间c }t] p!qErx1M
   }
sv D&W8m0  });
/?TP.{ gH1R O!B0  // 从文件中读取Bug记录
0G(H+ug!c!^0  bugs = Bug.loadBugs(new File("bugs.dat"));ITPUB个人空间6^ sD*}8C M'y
  // 把bugs作为表格的输入
-D;zXqryF%\+C0  tableViewer.setInput(bugs);

  shell.pack();
4v)Zt5^ Y5u0  shell.open();

  while (!shell.isDisposed()) {ITPUB个人空间]ANSt z-Rsi
   if (!display.readAndDispatch()) {ITPUB个人空间WlM5r V3R`
    display.sleep();
_^~0O'Tu^sN(X0   }ITPUB个人空间+`b,b#G6~KZ
  }

  display.dispose();
[3V{+@})er6|0 }

 // 保存当前的Bug记录ITPUB个人空间${zk ~ IF_9c&u
 private void saveBugs(Vector v) {

  DataOutputStream ut = null;ITPUB个人空间 Eo9Z&_k
  try {ITPUB个人空间{o qB9\Ch v6S
   File file = new File("bugs.dat");

   out = new DataOutputStream(new FileOutputStream(file));

   for (int i = 0; i < v.size(); i++) {ITPUB个人空间o6B_e1L3n^P1M\
    Bug bug = (Bug) v.elementAt(i);ITPUB个人空间 IX`bFj)w2v
    out.writeUTF(bug.id);
{o~/E;~2XR0    out.writeUTF(bug.summary);
2I_T(cB9qqU#D0    out.writeUTF(bug.assignedTo);ITPUB个人空间Gi s8@ w1GQtdG
    out.writeBoolean(bug.isSolved);ITPUB个人空间xlw\0D8^ I2NG
   }ITPUB个人空间&thNv[F C&p!`-y&B)t
  } catch (IOException ioe) {

  } finally {
/^T2e6em8w%klehK+t0   try {ITPUB个人空间5` h;_P4fu@!LOZ
    if (out != null)ITPUB个人空间@U`8T!|Sq%L*L/t
     out.close();ITPUB个人空间 B1gT4mbJ^
   } catch (IOException e) {
c \ ~P@L0    e.printStackTrace();
wx7g+\q:T1P0   }
%L g7zPJUE0  }
,{ Z-XjI9[0 }

 public static void main(String[] args) {
[H@I{v2t0  new BugTrackerTableViewer();
8u\8| FzdN f]l0 }ITPUB个人空间7`Q;cz^U
}
7f*km.p+bH.N2j)V0上例为表格添加了过滤器(ViewerFilter)和排序器(BugSorter),用户可以单击表格的列头按此列进行排序。另外,还能够通过工具栏按钮过滤掉已解决的Bug信息。程序运行效果如图1所示。

ITPUB个人空间mJw(r"lvf
 
lMOE1f6h/tN0图1  TableViewer组件

ITPUB个人空间(V2vW zDqt0l
TableViewer的功能比较强大,在复杂的应用中可以用它代替SWT中的Table组件,实现表格的完美展现。ITPUB个人空间2] b)v Yh8VNk
除了TreeViewer和TableViewer组件外,JFace中还封装了ListViewer等组件,用户可以直接使用这些组件实现自己的功能。
_0F)\!M8GtKx2cR0提示:所有的Viewer组件都封装了SWT中组件的实现,例如TreeViewer封装了Tree组件,可以通过Viewer组件得到对应的SWT组件(“getTree”),这可能在窗口布局或直接处理Viewer中的SWT窗口时会使用到。


GJ8u%aU!U8l/j{&P0 


TAG:

引用 删除 elvaelva1232003   /   2008-07-25 15:53:32
5
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-12  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 11243
  • 日志数: 43
  • 文件数: 11
  • 建立时间: 2008-02-14
  • 更新时间: 2008-09-05

RSS订阅

Open Toolbar