前邊實現了一個表格的基本功能,但這并不夠好,能否為表格實現一些更好的功能呢?答案是肯定的。下邊我們來加入直接編輯的功能。
一、要實現這個功能必須提供一個實現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"});
CellEditor[] cellEditor = new CellEditor[5];
cellEditor[0] = null;
cellEditor[1] = new ComboBoxCellEditor(tableViewer.getTable(),MyCellModifier.NAMES,SWT.READ_ONLY);
cellEditor[2] = new CheckboxCellEditor(tableViewer.getTable());
cellEditor[3] = new TextCellEditor(tableViewer.getTable());
cellEditor[4] = null;
tableViewer.setCellEditors(cellEditor);
ICellModifier modifier = new MyCellModifier(tableViewer);
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.tkk7.com/Files/dreamstone/jface-3.rar