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

时间:2023-01-18 12:47:22
 

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

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)import  org.eclipse.jface.viewers.ICellModifier;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)
import  org.eclipse.jface.viewers.TableViewer;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)
import  org.eclipse.swt.widgets.TableItem;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)
public   class  MyCellModifier  implements  ICellModifier {
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        
private TableViewer tv;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        
public static String[] NAMES ={"张三","李四","小红","翠花"};
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        
public MyCellModifier(TableViewer tv){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
this.tv = tv;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        }

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        
public boolean canModify(Object element, String property) {
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            
return true;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        }

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        
public Object getValue(Object element, String property) {
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            People p 
= (People)element;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            
if(property.equals("name")){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
return new Integer(getNameIndex(p.getName()));
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            }
else if(property.equals("sex")){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
return new Boolean(p.getSex().equals(""));
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            }
else if(property.equals("age")){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
return String.valueOf(p.getAge());
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            }

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            
throw new RuntimeException("error column name : " + property);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        }

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        
private int getNameIndex(String name){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            
for(int i=0;i<NAMES.length;i++){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
if(NAMES[i].equals(name)){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                    
return i;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                }

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

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

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        
public void modify(Object element, String property, Object value) {
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            TableItem item 
= (TableItem)element;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            People p 
= (People)item.getData();
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            
if (property.equals("name")){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                Integer comboIndex 
= (Integer)value;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
if(comboIndex.intValue() == -1){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                    
return ;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                }

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                String newName 
= NAMES[comboIndex.intValue()];
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                p.setName(newName);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            }
else if(property.equals("sex")){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                Boolean newValue 
= (Boolean)value;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                System.out.println(newValue);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
if(newValue.booleanValue()){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                    p.setSex(
"");
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                }
else{
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                    p.setSex(
"");
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                }

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            }
else if (property.equals("age")){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                String newValue 
= (String)value;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
if(newValue.equals("")){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                    
return ;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                }

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                Integer newAge 
= new Integer(newValue);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                p.setAge(newAge);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            }
else{
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
throw new RuntimeException("错误列名:" + property);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            }

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            tv.update(p, 
null);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        }

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

二、好了,有了这个类,下一部就是如何把它和TestTableViewer关联起来,在TestTableViewer中setInput()后加入如下内容
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)tableViewer.setColumnProperties( new  String[] {"id","name","sex","age","createDate"} );
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        CellEditor[] cellEditor 
=   new  CellEditor[ 5 ];
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        cellEditor[
0 =   null ;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        cellEditor[
1 =   new  ComboBoxCellEditor(tableViewer.getTable(),MyCellModifier.NAMES,SWT.READ_ONLY);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        cellEditor[
2 =   new  CheckboxCellEditor(tableViewer.getTable());
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        cellEditor[
3 =   new  TextCellEditor(tableViewer.getTable());
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        cellEditor[
4 =   null ;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        tableViewer.setCellEditors(cellEditor);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        ICellModifier modifier 
=   new  MyCellModifier(tableViewer);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        tableViewer.setCellModifier(modifier);
我们让名字这一列用下拉条来编辑,让性别这一列变成类似checkbox的操作,让年龄这一类变成直接输入
ok,尝试一下。
三、问题出现,如果年龄的地方我们输入一个非数字呢,所以为了安全起见,我们加入一个验证器,禁止用户输入非数字
在上边的内容下加入
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Text text  =  (Text)cellEditor[ 3 ].getControl();
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        text.addVerifyListener(
new  VerifyListener() {
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)            
public void verifyText(VerifyEvent e){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                String inStr 
= e.text;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                
if (inStr.length() > 0){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                    
try{
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                        Integer.parseInt(inStr);
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                        e.doit 
= true;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                    }
catch(Exception ep){
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                        e.doit 
= false;
Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)                    }

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

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

Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)        }
);
好了,再试试是否不能输入非整数了?解决。其实还是有些问题的,试着输入个0,呵呵。这里就需要你自己按照自己的实际需求来实现了。
但作为demo这个的目的已经达到了。
source下载: http://www.blogjava.net/Files/dreamstone/jface-3.rar