最近做的工程需要实现一个表格树,但和普通的表格树不同的是,我的表格树不是显示,而是需要编辑录入,需要录入一个孩子表格项时,点击一个按钮new一个空的表格项在父亲的下面,外观上看上去有一个虚线表示父子关系(点击按钮生成孩子结点这部分我还没有实现)。把这个表格存为XML格式,最后由XML文件生成一个树形图。
  不废话了,我的问题是:
  1、照很多书上的代码改动后敲进去,我的表格不能编辑,点击表格项没有反应,改了好几天了还是不行;
  2、刚才上面我说的点击一个按钮生成它的孩子表格项这个想法可不可以实现(现在只是有这么个想法)。
  现把我的代码贴在下面,希望这方面的高手能耐心看一下,先在这谢了,完了我把分都给你!PS:我写的是个插件程序,另外一些不重要的函数我就不写了public class TableEditor extends EditorPart {FeatureComposite featureComp;static private FeatureEntity obj;private static boolean dirty = false;private String[] layers = new String[]{"Function","Operation","Presentation"};private String[] types = new String[]{"Mandatory","Optional","Alternative"};private List featureList = new ArrayList();private String filepath;public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
//初始化特征表格界面
setSite(site);
setInput(input);
setPartName(input.getName()); 
}
  public void createPartControl(Composite parent) {
//创建特征表格的界面组件
Composite topComp = new Composite(parent, SWT.NONE);
GridLayout gridlayout = new GridLayout(2, false);
gridlayout.marginTop = 10;
gridlayout.marginLeft = 90;
gridlayout.marginRight = 130;
gridlayout.verticalSpacing = 5;
gridlayout.horizontalSpacing = 30;
topComp.setLayout(gridlayout);String eclipsepath=Platform.getInstanceLocation().getURL().getPath().toString();
filepath=eclipsepath+getEditorSite().getPart().getTitleToolTip().toString();featureComp=new FeatureComposite(topComp, SWT.NONE,featureList);
getSite().setSelectionProvider(obj);
//添加下面一句是为了防止在打开CRC卡的时候直接提示保存;
dirty = false;}
private class FeatureComposite{private TreeViewer tv; 
private Tree tree;
private Group group;
private List list = new ArrayList();public void setList(List list){
this.list = list;
}
public List getList(List list){
return list;
}
public FeatureComposite(Composite parent, int style, List featuList){
this.list = featuList;
createFeatureComposite(parent,style);
}private Composite createFeatureComposite(Composite comp, int style){
group = new Group (comp,style);
group.setText("请输入特征信息");
GridData gd = new GridData(GridData.BEGINNING  
| GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
gd.horizontalSpan = 2;
group.setLayoutData(gd);
group.setLayout(new GridLayout());
{
tv = new TreeViewer(group, SWT.MULTI | SWT.BORDER
| SWT.FULL_SELECTION);
tree = tv.getTree();
  tree.setLayout(new FillLayout());
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
final GridData gridData_1 = new GridData(GridData.BEGINNING  
  | GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
gridData_1.horizontalSpan = 2;
tree.setLayoutData(gridData_1);
  
TreeColumn column1 = new TreeColumn(tree, SWT.BORDER);
column1.setText("Feature");
column1.setWidth(150);
TreeColumn column2 = new TreeColumn(tree, SWT.BORDER);
column2.setText("Layer");
column2.setWidth(100);
TreeColumn column3 = new TreeColumn(tree, SWT.BORDER);
column3.setText("Type");
column3.setWidth(100);
TreeColumn column4 = new TreeColumn(tree, SWT.BORDER);
column4.setText("Description");
column4.setWidth(200);
TreeColumn column5 = new TreeColumn(tree, SWT.BORDER);
column5.setText("Rationale");
column5.setWidth(150);
tv.setContentProvider(new TreeViewerContentProvider());
tv.setLabelProvider(new TreeViewerLabelProvider());
tv.setInput(list);
//添加单击修改单元格值
{
tv.setColumnProperties(new String[] { "0", "1", "2", "3", "4" });
CellEditor[] cellEditor = new CellEditor[5];
cellEditor[0] = new TextCellEditor(tv.getTree());
cellEditor[1] = new ComboBoxCellEditor(tv.getTree(),layers,SWT.READ_ONLY);
cellEditor[2] = new ComboBoxCellEditor(tv.getTree(),types,SWT.READ_ONLY);
cellEditor[3] = new TextCellEditor(tv.getTree());
cellEditor[4] = new TextCellEditor(tv.getTree());   
tv.setCellEditors(cellEditor);
tv.setCellModifier(new FeatureCellModifier());
for(int i = 0; i<5; i++){
cellEditor[i].addListener(new ICellEditorListener(){public void applyEditorValue() {
}public void cancelEditor() {}public void editorValueChanged(boolean oldValidState, boolean newValidState) {
if(!isDirty()){
dirty = true;
firePropertyChange(IEditorPart.PROP_DIRTY);
}
}
});
}
  
}
}
return group;
}
private class TreeViewerContentProvider implements  
ITreeContentProvider{@Override
public Object[] getChildren(Object parentElement) {
return null;
}public Object getParent(Object element) {
return null;
}public boolean hasChildren(Object element) {
return false;
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof List)
return ((List) inputElement).toArray();
else
return new Object[0];
}
public void dispose() { 
}@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {}}
private class TreeViewerLabelProvider implements ITableLabelProvider{
public String getColumnText(Object element, int columnIndex){
FeatureEntity FEntity = (FeatureEntity) element;
switch (columnIndex){case 0:
return FEntity.getFeatureName().toString();
case 1:
return FEntity.getLayer().toString();
case 2:
return FEntity.getType().toString();
case 3:
return FEntity.getDescription().toString();
case 4:
return FEntity.getRationale().toString();
default:
return "";
}
}@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}@Override
public void addListener(ILabelProviderListener listener) {}@Override
public void dispose() {
}@Override
public boolean isLabelProperty(Object element, String property) {return false;
}@Override
public void removeListener(ILabelProviderListener listener) {
}
}
private class FeatureCellModifier implements ICellModifier{@Override
public boolean canModify(Object element, String property) {return true;
}@Override
public Object getValue(Object element, String property) {
FeatureEntity FEntity = (FeatureEntity) element;
if(property.equals("0"))
return FEntity.getFeatureName();
else if (property.equals("1"))
{
if(FEntity.getLayer().equals(""))
return new Integer(0);
for(int i = 0; i < layers.length; i++)
if(FEntity.getLayer().equals(layers[i]))
{
return new Integer(i);
}
}else if (property.equals("2"))
{
if(FEntity.getType().equals(""))
return new Integer(0);
for(int i = 0; i < types.length; i++)
if(FEntity.getType().equals(types[i]))
{
return new Integer(i);
}
}
else if (property.equals("3"))
return FEntity.getDescription();
else if (property.equals("4"))
return FEntity.getRationale();
return "";
}@Override
public void modify(Object element, String property, Object value) {
  
Boolean bool = false;
TableItem tableItem = (TableItem) element;
FeatureEntity FEntity = (FeatureEntity) tableItem.getData();
if(property.equals("0")){
String newValue = (String) value;
if(newValue.equals(""))
return;
FEntity.setFeatureName(newValue);
}  
else if (property.equals("1")){
Integer newValue = (Integer) value;
String layer = layers[newValue.intValue()];
if(newValue.equals(""))
return;
FEntity.setLayer(layer);
}
else if (property.equals("2")){
Integer newValue = (Integer) value;
String type = types[newValue.intValue()];
if(newValue.equals(""))
return;
FEntity.setLayer(type);
}
else if (property.equals("3")){
String newValue = (String) value;
if(newValue.equals(""))
return;
FEntity.setDescription(newValue);
}
else if (property.equals("4")){
String newValue = (String) value;
if(newValue.equals(""))
return;
FEntity.setRationale(newValue);
}
else{
return;
}
FeatureEntity newEntity = (FeatureEntity) list.get(list.size()-1);
if(newEntity.getFeatureName() == "" && newEntity.getLayer() == ""
&& newEntity.getType() == "" && newEntity.getDescription() == ""
&& newEntity.getRationale() == "")
bool =true;
if(bool != true){
FeatureEntity e = new FeatureEntity();
e.setFeatureName("");
e.setLayer("");
e.setType("");
e.setDescription("");
e.setRationale("");
list.add(e);
}
tv.refresh();
}}
}}