Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)

摘要:
表的基本功能已经在前面实现,但这还不够好。我们能为表实现一些更好的功能吗?接下来,让我们添加直接编辑功能。

 

前边实现了一个表格的基本功能,但这并不够好,能否为表格实现一些更好的功能呢?答案是肯定的。下边我们来加入直接编辑的功能。
一、要实现这个功能必须提供一个实现ICellModifier的类。内容如下
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.TableItem;

public class MyCellModifier implements ICellModifier{
        private TableViewer tv;
        public static String[] NAMES ={"张三","李四","小红","翠花"};
       
        public MyCellModifier(TableViewer tv){
                this.tv = tv;
        }
        public boolean canModify(Object element, String property) {
            return true;
        }

        public Object getValue(Object element, String property) {
            People p = (People)element;
            if(property.equals("name")){
                return new Integer(getNameIndex(p.getName()));
            }else if(property.equals("sex")){
                return new Boolean(p.getSex().equals("男"));
            }else if(property.equals("age")){
                return String.valueOf(p.getAge());
            }
            throw new RuntimeException("error column name : " + property);
        }
        private int getNameIndex(String name){
            for(int i=0;i<NAMES.length;i++){
                if(NAMES[i].equals(name)){
                    return i;
                }
            }
            return -1;
        }

        public void modify(Object element, String property, Object value) {
            TableItem item = (TableItem)element;
            People p = (People)item.getData();
            if (property.equals("name")){
                Integer comboIndex = (Integer)value;
                if(comboIndex.intValue() == -1){
                    return ;
                }
                String newName = NAMES[comboIndex.intValue()];
                p.setName(newName);
            }else if(property.equals("sex")){
                Boolean newValue = (Boolean)value;
                System.out.println(newValue);
                if(newValue.booleanValue()){
                    p.setSex("男");
                }else{
                    p.setSex("女");
                }
            }else if (property.equals("age")){
                String newValue = (String)value;
                if(newValue.equals("")){
                    return ;
                }
                Integer newAge = new Integer(newValue);
                p.setAge(newAge);
            }else{
                throw new RuntimeException("错误列名:" + property);
            }
            tv.update(p, null);
        }
       
    }
二、好了,有了这个类,下一部就是如何把它和TestTableViewer关联起来,在TestTableViewer中setInput()后加入如下内容
tableViewer.setColumnProperties(new
 String[]
{"id","name","sex","age","createDate"}
);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        CellEditor[] cellEditor 
= new CellEditor[5
];
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        cellEditor[
0= null
;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        cellEditor[
1= new
 ComboBoxCellEditor(tableViewer.getTable(),MyCellModifier.NAMES,SWT.READ_ONLY);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        cellEditor[
2= new
 CheckboxCellEditor(tableViewer.getTable());
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        cellEditor[
3= new
 TextCellEditor(tableViewer.getTable());
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        cellEditor[
4= null
;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        tableViewer.setCellEditors(cellEditor);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        ICellModifier modifier 
= new
 MyCellModifier(tableViewer);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)第1张        tableViewer.setCellModifier(modifier);

我们让名字这一列用下拉条来编辑,让性别这一列变成类似checkbox的操作,让年龄这一类变成直接输入
ok,尝试一下。
三、问题出现,如果年龄的地方我们输入一个非数字呢,所以为了安全起见,我们加入一个验证器,禁止用户输入非数字
在上边的内容下加入
Text text = (Text)cellEditor[3].getControl();
        text.addVerifyListener(new VerifyListener(){
            public void verifyText(VerifyEvent e){
                String inStr = e.text;
                if (inStr.length() > 0){
                    try{
                        Integer.parseInt(inStr);
                        e.doit = true;
                    }catch(Exception ep){
                        e.doit = false;
                    }
                }
            }
        });
好了,再试试是否不能输入非整数了?解决。其实还是有些问题的,试着输入个0,呵呵。这里就需要你自己按照自己的实际需求来实现了。
但作为demo这个的目的已经达到了。
source下载:
http://www.blogjava.net/Files/dreamstone/jface-3.rar

免责声明:文章转载自《Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQLSERVER TRUNCATE 运用删除 Dblink 报错 ORA02024: database link not found 的解决方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Swt/Jface进度条 (转)

处理长时间的任务的时候常需要进度条显示,有几种实现方式1,普通的进度条 importjava.lang.reflect.InvocationTargetException;importorg.eclipse.core.runtime.IProgressMonitor;importorg.eclipse.jface.dialogs.ProgressMoni...

eclipse 搭建Swt 环境

我本是想用java开发一个记事本,开发记事本使用到SWT插件,我从网上找了许多的资料去集成插件,创建我的第一个SWT项目,以下是我搭建SWT环境的过程。 一、查看当前使用的exlipse 版本型号 在exlpse 选项栏找到Help --> about Eclipse 选项即可看到当前exlipse 的版本型号。如图: 二、到官网上去下载相匹配的S...

SWT/RAP计算器

/** *2.测试 */ public class NofTest extends AbstractEntryPoint {        Text text,text2;    RemoteObject remoteObject1;    Button testbtn;    @Override    protected void createConte...