14.7 带复选框的表格(CheckboxTableViewer类)
带复选框的表格如图14.10所示,它具有如下功能:
● 单击“全选”按钮时,将表格中的所有记录选中(选中复选框)。
● 单击“全不选”按钮时,取消所有选择(取消选中复选框)。
● 单击“删除”按钮时,将所有选中复选框的记录删除。

图14.10 带复选框的表格
本节实例在前几节的代码基础上修改完成(完整代码见配书光盘的TableViewer6.java文件)。要完成此实例需要如下几个步骤。
14.7.1 使用表格的复选框式样
(1)在创建TableViewer对象时多加一个SWT.CHECK式样,表格变为复选框式。复选框式的表格要取得选中的记录,还需要增加一个CheckboxTableViewer对象来辅助表格的使用,因为仅TableViewer对象无法取得选中的记录。
final TableViewer tv = new TableViewer(viewForm, SWT.CHECK | SWT.MULTI | SWT.……
final CheckboxTableViewer ctv = new CheckboxTableViewer(tv.getTable());
(2)修改创建MyActionGroup的语句,将CheckboxTableViewer的ctv对象作构造函数的第二个参数传入,因为MyActionGroup中的Action需要用到此对象。
MyActionGroup actionGroup = new MyActionGroup(tv, ctv);
这一步完成后,因为还没有对MyActionGroup类作相应改动,Eclipse会显示错误。下面开始修改MyActionGroup类。
14.7.2 修改MyActionGroup类
在原有MyActionGroup类的代码中作如下几处修改:
● 新增一个用于接受CheckboxTableViewer对象的构造函数。
● 增加“全选”和“全不选”两个Action类,并相应修改fillActionToolBars方法。
● 修改“删除”的RemoveAction,改由CheckboxTableViewer来取得选中的记录。因为前几节的程序也用到RemoveAction,为了兼容,所以RemoveAction原有的处理代码还不能废弃掉。可以加一个表格是否为复选框式样的判断,以决定使用哪种删除处理代码。
具体代码如下所示:(和原代码相同部分用省略号代替)
public class MyActionGroup extends ActionGroup {
private TableViewer tv;
private CheckboxTableViewer ctv; //新增的语句
public MyActionGroup(TableViewer v) {
this.tv = v;
}
//新增一个构造函数
public MyActionGroup(TableViewer v, CheckboxTableViewer ctv) {
this.tv = v;
this.ctv = ctv;
}
……
//修改原来的“删除”Action的run方法
private class RemoveAction extends Action {
……
public void run() {
if (ctv != null) {
Object[ ] checkObj = ctv.getCheckedElements(); // 取得打勾的记录
if (checkObj.length == 0) {// 判断是否有勾选复选框
MessageDialog.openInformation(null, "提示", "请先勾选记录");
return;
}
for (int i = 0; i < checkObj.length; i++) {
PeopleEntity o = (PeopleEntity) checkObj[i];
ctv.remove(o);// 从表格界面上删除
List list = (List) tv.getInput();
list.remove(o);// 从数据模型的List容器中删除
// ....,从数据库中删除记录(略)
}
} else {
IStructuredSelection s = (IStructuredSelection) tv.getSelection();
if (s.isEmpty()) {// 判断是否有选择
MessageDialog.openInformation(null, "提示", "请先选择");
return;
}
for (Iterator it = s.iterator(); it.hasNext();) {
PeopleEntity o = (PeopleEntity) it.next();
tv.remove(o);// 从表格界面上删除
List list = (List) tv.getInput();
list.remove(o); // 从数据模型的List容器中删除
// ....,从数据库中删除记录(略)
}
}
}
}
……
//新增的“全选”Action
private class SelectAllAction extends Action {
public SelectAllAction() {
setHoverImageDescriptor(getImageDesc("selectall.gif"));
setText("全选");
}
public void run() {
if (ctv != null) ctv.setAllChecked(true); //将所有复选框打勾
}
}
//新增的“全不选”Action
private class DeselectAction extends Action {
public DeselectAction() {
setHoverImageDescriptor(getImageDesc("deselect.gif"));
setText("全不选");
}
public void run() {
if (ctv != null) ctv.setAllChecked(false); //取消所有复选框打勾
}
}
//修改此方法将“全选”、“全不选”加入
public void fillActionToolBars(ToolBarManager actionBarManager) {
……
Action selAllAction = new SelectAllAction();
Action deselAction = new DeselectAction();
……
actionBarManager.add(createContributionItem(selAllAction));
actionBarManager.add(createContributionItem(deselAction));
actionBarManager.update(true); // 更新工具栏,否则工具栏不显示任何按钮
}
}






