首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

14.8  让表格可直接编辑(CellEditor类、ICellModifier接口)

前面仅仅是显示表格数据,本节谈谈如何修改数据。本节实例效果如图14.11所示。本节实例在前几节的代码基础上修改完成(完整代码见配书光盘的TableViewer7.java文件)。

图14.11  CellEditor效果图

14.8.1  设置编辑组件CellEditor

首先在TableViewer主程序前部的变量定义区中创建一个静态公用的字符串数组,它们就是修改“姓名”列时出现在下拉框中的值。

public static String[] NAMES = { "老张", "小红", "陈刚", "周阅", "陈常恩" };

接着给表格列添加编辑组件CellEditor,在tv.setInput(data)语句之后,加入如下程序块:

// 定义每一列的别名

tv.setColumnProperties(new String[] { "id", "name", "sex", "age", "createdate" });

// 设置每一列的单元格编辑组件CellEditor

CellEditor[] cellEditor = new CellEditor[5];

cellEditor[0] = null;

cellEditor[1] = new ComboBoxCellEditor(tv.getTable(), NAMES, SWT.READ_ONLY);

cellEditor[2] = new CheckboxCellEditor(tv.getTable());

cellEditor[3] = new TextCellEditor(tv.getTable());

cellEditor[4] = null;

tv.setCellEditors(cellEditor);

tv.setCellModifier(new MyCellModifier(tv)); // 设置表格的修改器MyCellModifier

Text text = (Text) cellEditor[3].getControl();// 设置第4列只能输入数值

text.addVerifyListener(new VerifyListener() { // 以下代码说明参阅第8.4节“文本框”,完全一样

         public void verifyText(VerifyEvent e) {

                   String inStr = e.text;

                   if (inStr.length() > 0) {

                            e.doit = NumberUtils.isDigits(inStr);

                   }

         }

});

程序说明:表格设置的列别名在修改器MyCellModifier类中要用到。和设置列别名一样,设置列的CellEditor编辑组件也是用数组的方式,其数组序号和列序号一一对应。

14.8.2  创建修改器ICellModifier

修改器MyCellModifier是最重要的一个类,也是最复杂的一个类,编程时一不小心就容易出BUG。其代码如下所示:

//------------- 文件名:MyCellModifier.java --------------

public class MyCellModifier implements ICellModifier {

         private TableViewer tv;

         public MyCellModifier(TableViewer tv) {

                   this.tv = tv;

         }

         // 判断是否可以修改某条记录的某一字段。这里返回true表示都可以修改

         // 参数element是表格记录对象,也就是PeopleEntity对象

         // 参数property是列别名。该值不会有CellEditor为null的列,也就是说它不可能为id,createdate

         public boolean canModify(Object element, String property) {

                   return true;

         }

         // 此方法决定当单击单元格出现CellEditor时应该显示什么值。参数说明参考canModify方法

         // 每种CellEditor要求返回的数据类型都是各不相同的,类型不对应就会出错

         public Object getValue(Object element, String property) {

                   PeopleEntity o = (PeopleEntity) element;

                   if (property.equals("name")) {

                            // ComboBoxCellEditor要求返回姓名在下拉框中的索引值

                            return getNameIndex(o.getName());

                   } else if (property.equals("sex")) {

                            // CheckboxCellEditor要求返回当前值对应的布尔值

                            return o.isSex();

                   } else if (property.equals("age")) {

                            // TextCellEditor要求返回当前值对应的字符串

                            return String.valueOf(o.getAge());

                   }

                   throw new RuntimeException("错误的列别名:" + property);

         }

         private int getNameIndex(String name) {

                   for (int i = 0; i < TableViewer7.NAMES.length; i++) {

                            if (TableViewer7.NAMES[i].equals(name))

                                     return i;

                   }

                   return -1;

         }

         // 从CellEditor取值得此单元格的值

         // 参数element是表格行对象TableItem,其getData()方法可取得PeopleEntity

         // 参数property是列别名

         // 参数value是修改后的新值。每种CellEditor的value的数据类型各不相同

         public void modify(Object element, String property, Object value) {

                   TableItem item = (TableItem) element;

                   PeopleEntity o = (PeopleEntity) item.getData();

                   // 根据新的修改值更新PeopleEntity对象的数据

                   if (property.equals("name")) {

                            // ComboBoxCellEditor的value是其索引值

                            Integer comboIndex = (Integer) value;

                            String newName = TableViewer7.NAMES[comboIndex];

                            o.setName(newName);

                   } else if (property.equals("sex")) {

                            // CheckboxCellEditor的value是布尔值

                            Boolean newValue = (Boolean) value;

                            o.setSex(newValue);

                   } else if (property.equals("age")) {

                            // TextCellEditor的value就是文本框里的字符

                            String newValue = (String) value;

                            if (newValue.equals(""))// 如果不修改

                                     return;

                            int newAge = Integer.parseInt(newValue);

                            o.setAge(newAge);

                   } else {

                            throw new RuntimeException("错误的列别名:" + property);

                   }

                   // 更新对象在表格上的界面显示。也可以用tv.refresh()全面更新界面,但太浪费效率

                   tv.update(o, null);

         }

}

程序说明:

  ● 当单击一个可修改表格列时,首先执行canModify方法来决定是否编辑这条记录,如果它返回true才会接着去执行getValue方法,并通过getValue方法决定编辑组件的显示值。接着用户在表格上显示的编辑组件里进行值的修改,修改完成后,将修改值传入到modify方法,在此方法中自己编程把新值更新到表格显示。

  ● 在感观上单元格编辑组件似乎是表格的一部分,但实际上它是作为单独组件叠加在表格上的,加上编辑组件种类复杂,所以才要MyCellModifier这样的类来作为编辑组件和表格组件的中间人,进行数据处理和传递。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论