我已经写了一部分代码了,不过我现在已经做不下去了,那位大侠帮我修改一下。
主要的功能就是,实现一个带树型的表格控件,这个表格控件可以编辑,编辑部分应该有一个使用ComboxCellEditor的例子,我可以根据数据的不同,选择使用TextCellEditor还是ComboxCellEditor实现编辑功能。不用我的代码,如果有这样的例子也可以。package test;import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TreeColumn;import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;public class TestFrame extends Shell {
public static Element element = null;
static {
element = DocumentFactory.getInstance().createElement("root");
Element f1 = element.addElement("folder");
f1.addAttribute("name", "folder1");
Element e1 = f1.addElement("data");
e1.addAttribute("name", "e1");
e1.addAttribute("value", "v1");
Element e2 = f1.addElement("data");
e2.addAttribute("name", "e2");
e2.addAttribute("value", "v2");
Element f2 = element.addElement("folder");
f2.addAttribute("name", "folder2");
Element e3 = f2.addElement("data");
e3.addAttribute("name", "e3");
e3.addAttribute("value", "v3");
Element e4 = f2.addElement("data");
e4.addAttribute("name", "e4");
e4.addAttribute("value", "v4");
}

/**
 * Launch the application
 * @param args
 */
public static void main(String args[]) {
try {
Display display = Display.getDefault();
TestFrame shell = new TestFrame(display, SWT.SHELL_TRIM);
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
 * Create the shell
 * @param display
 * @param style
 */
public TestFrame(Display display, int style) {
super(display, style);
createContents();
setLayout(new FillLayout());
} /**
 * Create contents of the window
 */
protected void createContents() {
setText("SWT Application");
setSize(500, 375);

final TreeViewer ttv = new TreeViewer(this, SWT.BORDER);
ttv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));     // Set the content and label providers
    ttv.setContentProvider(new PlayerTreeContentProvider());
    ttv.setLabelProvider(new PlayerTreeLabelProvider());
    ttv.setInput(element);
    
    final CellEditor[] cellEditors = new CellEditor[2];
    cellEditors[1] = new TextCellEditor(ttv.getTree());
    ttv.setCellEditors(cellEditors);
    ttv.setColumnProperties(new String[]{"name", "value"});
    ttv.setCellModifier(new ICellModifier() {
public boolean canModify(Object element, String property) {
// TODO Auto-generated method stub
Element data = (Element)element;
if (data.getName().compareTo("folder") == 0) {
return false;
}
if (data.getName().compareTo("data") == 0) {
String strName = data.attributeValue("name");
if (strName.compareTo("e1") == 0) {
 cellEditors[1] = new ComboBoxCellEditor(
 ttv.getTree(), new String[]{"v1", "v5", "v6"});
}
}
return false;
} public Object getValue(Object element, String property) {
// TODO Auto-generated method stub
Element data = (Element)element;
return data.attributeValue("value");
} public void modify(Object element, String property, Object value) {
// TODO Auto-generated method stub
Item item = (Item) ((TreeColumn) element).getData();
if (item instanceof Element) {
((Element)item).setAttributeValue("value", value + "");
}
System.out.println(((Element)item).asXML());

    });     // Set up the table
    TreeColumn column1 = new TreeColumn(ttv.getTree(), SWT.CENTER);
        column1.setText("Name");
        column1.setWidth(200);
        TreeColumn column2 = new TreeColumn(ttv.getTree(), SWT.CENTER);
        column2.setText("Value");
        column2.setWidth(200);
    //Expand everything
    ttv.expandAll();
    // Pack the columns
    for (int i = 0, n = ttv.getTree().getColumnCount(); i < n; i++) {
     ttv.getTree().getColumn(i).pack();
    }
    // Turn on the header and the lines
    ttv.getTree().setHeaderVisible(true);
    ttv.getTree().setLinesVisible(true);
    // Pack the window
    pack();
} @Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
}class PlayerTreeContentProvider implements ITreeContentProvider {
private static final Object[] EMPTY = new Object[] {};

public Object[] getChildren(Object parentElement) {
// TODO Auto-generated method stub
if (parentElement instanceof Element) {
Object[] objs = ((Element)parentElement).elements().toArray();
return objs;
}
return EMPTY;
} public Object getParent(Object element) {
// TODO Auto-generated method stub
return ((Element)element).getParent();
} public boolean hasChildren(Object element) {
// TODO Auto-generated method stub
return getChildren(element).length > 0;
} public Object[] getElements(Object inputElement) {
// TODO Auto-generated method stub
return ((Element)inputElement).elements().toArray();
} public void dispose() {
// TODO Auto-generated method stub

} public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub

}
}class PlayerTreeLabelProvider implements ITableLabelProvider {
public static final int COLUMN_NAME = 0;
public static final int COLUMN_VALUE = 1;

public String getColumnText(Object element, int columnIndex) {
// TODO Auto-generated method stub
Element data = (Element) element;
System.out.println(data.asXML());
String text = "";
/*switch (columnIndex) {
case COLUMN_NAME:
text = data.attributeValue("name");
break;
case COLUMN_VALUE:
text = data.attributeValue("value");
break;
}*/

return text;
}

public void addListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub

} public void dispose() {
// TODO Auto-generated method stub

} public boolean isLabelProperty(Object element, String property) {
// TODO Auto-generated method stub
return false;
} public void removeListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub

} public Image getColumnImage(Object element, int columnIndex) {
// TODO Auto-generated method stub
return null;
}
}

解决方案 »

  1.   

    我这还有用TableTreeViewer实现的代码,那位能帮我把编辑部分的实现加上,先谢谢了。package test;import org.eclipse.jface.viewers.ILabelProviderListener;
    import org.eclipse.jface.viewers.ITableLabelProvider;
    import org.eclipse.jface.viewers.ITreeContentProvider;
    import org.eclipse.jface.viewers.TableTreeViewer;
    import org.eclipse.jface.viewers.Viewer;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Image;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.TableColumn;import org.dom4j.DocumentFactory;
    import org.dom4j.Element;public class TestFrameEx extends Shell {
    public static Element element = null;
    static {
    element = DocumentFactory.getInstance().createElement("root");
    Element f1 = element.addElement("folder");
    f1.addAttribute("name", "folder1");
    Element e1 = f1.addElement("data");
    e1.addAttribute("name", "e1");
    e1.addAttribute("value", "v1");
    Element e2 = f1.addElement("data");
    e2.addAttribute("name", "e2");
    e2.addAttribute("value", "v2");
    Element f2 = element.addElement("folder");
    f2.addAttribute("name", "folder2");
    Element e3 = f2.addElement("data");
    e3.addAttribute("name", "e3");
    e3.addAttribute("value", "v3");
    Element e4 = f2.addElement("data");
    e4.addAttribute("name", "e4");
    e4.addAttribute("value", "v4");
    }

    /**
     * Launch the application
     * @param args
     */
    public static void main(String args[]) {
    try {
    Display display = Display.getDefault();
    TestFrameEx shell = new TestFrameEx(display, SWT.SHELL_TRIM);
    shell.open();
    shell.layout();
    while (!shell.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    } /**
     * Create the shell
     * @param display
     * @param style
     */
    public TestFrameEx(Display display, int style) {
    super(display, style);
    createContents();
    setLayout(new FillLayout());
    } /**
     * Create contents of the window
     */
    protected void createContents() {
    setText("SWT Application");
    setSize(500, 375);

    final TableTreeViewer ttv = new TableTreeViewer(this, SWT.BORDER);
    ttv.getTableTree().setLayoutData(new GridData(GridData.FILL_BOTH));     // Set the content and label providers
        ttv.setContentProvider(new MyPlayerTreeContentProvider());
        ttv.setLabelProvider(new MyPlayerTreeLabelProvider());
        ttv.setInput(element);
        
        //final CellEditor[] cellEditors = new CellEditor[2];
        //cellEditors[1] = new TextCellEditor(ttv.getTableTree());
        /*ttv.setCellEditors(cellEditors);
        ttv.setColumnProperties(new String[]{"name", "value"});
        ttv.setCellModifier(new ICellModifier() {
    public boolean canModify(Object element, String property) {
    // TODO Auto-generated method stub
    Element data = (Element)element;
    if (data.getName().compareTo("folder") == 0) {
    return false;
    }
    if (data.getName().compareTo("data") == 0) {
    String strName = data.attributeValue("name");
    if (strName.compareTo("e1") == 0) {
     cellEditors[1] = new ComboBoxCellEditor(
     ttv.getTableTree(), new String[]{"v1", "v5", "v6"});
    }
    if (property.compareTo("value") == 0)
    return true;
    }
    return false;
    } public Object getValue(Object element, String property) {
    // TODO Auto-generated method stub
    Element data = (Element)element;
    return data.attributeValue("value");
    } public void modify(Object element, String property, Object value) {
    // TODO Auto-generated method stub
    Item item = (Item) ((TreeColumn) element).getData();
    if (item instanceof Element) {
    ((Element)item).setAttributeValue("value", value + "");
    }
    System.out.println(((Element)item).asXML());

        });*/     // Set up the table
        TableColumn column1 = new TableColumn(ttv.getTableTree().getTable(), SWT.CENTER);
            column1.setText("Name");
            column1.setWidth(200);
            TableColumn column2 = new TableColumn(ttv.getTableTree().getTable(), SWT.CENTER);
            column2.setText("Value");
            column2.setWidth(200);
        //Expand everything
        ttv.expandAll();
        // Pack the columns
        for (int i = 0, n = ttv.getTableTree().getTable().getColumnCount(); i < n; i++) {
         ttv.getTableTree().getTable().getColumn(i).pack();
        }
        // Turn on the header and the lines
        ttv.getTableTree().getTable().setHeaderVisible(true);
        ttv.getTableTree().getTable().setLinesVisible(true);
        // Pack the window
        pack();
        
        ttv.reveal(ttv.getElementAt(0));
    } @Override
    protected void checkSubclass() {
    // Disable the check that prevents subclassing of SWT components
    }
    }class MyPlayerTreeContentProvider implements ITreeContentProvider {
    private static final Object[] EMPTY = new Object[] {};

    public Object[] getChildren(Object parentElement) {
    // TODO Auto-generated method stub
    if (parentElement instanceof Element) {
    Object[] objs = ((Element)parentElement).elements().toArray();
    System.out.println(objs);
    return objs;
    }
    return EMPTY;
    } public Object getParent(Object element) {
    // TODO Auto-generated method stub
    return ((Element)element).getParent();
    } public boolean hasChildren(Object element) {
    // TODO Auto-generated method stub
    return getChildren(element).length > 0;
    } public Object[] getElements(Object inputElement) {
    // TODO Auto-generated method stub
    return getChildren(inputElement);
    } public void dispose() {
    // TODO Auto-generated method stub

    } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    // TODO Auto-generated method stub

    }
    }class MyPlayerTreeLabelProvider implements ITableLabelProvider {
    public static final int COLUMN_NAME = 0;
    public static final int COLUMN_VALUE = 1;

    public String getColumnText(Object element, int columnIndex) {
    // TODO Auto-generated method stub
    Element data = (Element) element;
    //System.out.println(data.asXML());
    String text = "";
    switch (columnIndex) {
    case COLUMN_NAME:
    text = data.attributeValue("name");
    break;
    case COLUMN_VALUE:
    text = data.attributeValue("value");
    break;
    }

    return text;
    }

    public void addListener(ILabelProviderListener listener) {
    // TODO Auto-generated method stub

    } public void dispose() {
    // TODO Auto-generated method stub

    } public boolean isLabelProperty(Object element, String property) {
    // TODO Auto-generated method stub
    return false;
    } public void removeListener(ILabelProviderListener listener) {
    // TODO Auto-generated method stub

    } public Image getColumnImage(Object element, int columnIndex) {
    // TODO Auto-generated method stub
    return null;
    }
    }
      

  2.   

    楼主啊,代码太长了。没排版实在...给个参考:http://www.cn-java.com/www1/?action-viewnews-itemid-2109
      

  3.   

    楼上大哥,我要用SWT做的,不是swing的。
      

  4.   

    楼上大哥,我要用SWT做的,不是swing的。
      

  5.   

    你看行吗?
    package test;import org.eclipse.jface.viewers.ILabelProviderListener;
    import org.eclipse.jface.viewers.ITableLabelProvider;
    import org.eclipse.jface.viewers.ITreeContentProvider;
    import org.eclipse.jface.viewers.TableTreeViewer;
    import org.eclipse.jface.viewers.Viewer;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Image;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.TableColumn;import org.dom4j.DocumentFactory;
    import org.dom4j.Element;public class TestFrameEx extends Shell {
    public static Element element = null;
    static {
    element = DocumentFactory.getInstance().createElement("root");
    Element f1 = element.addElement("folder");
    f1.addAttribute("name", "folder1");
    Element e1 = f1.addElement("data");
    e1.addAttribute("name", "e1");
    e1.addAttribute("value", "v1");
    Element e2 = f1.addElement("data");
    e2.addAttribute("name", "e2");
    e2.addAttribute("value", "v2");
    Element f2 = element.addElement("folder");
    f2.addAttribute("name", "folder2");
    Element e3 = f2.addElement("data");
    e3.addAttribute("name", "e3");
    e3.addAttribute("value", "v3");
    Element e4 = f2.addElement("data");
    e4.addAttribute("name", "e4");
    e4.addAttribute("value", "v4");
    }/**
    * Launch the application
    * @param args
    */
    public static void main(String args[]) {
    try {
    Display display = Display.getDefault();
    TestFrameEx shell = new TestFrameEx(display, SWT.SHELL_TRIM);
    shell.open();
    shell.layout();
    while (!shell.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }/**
    * Create the shell
    * @param display
    * @param style
    */
    public TestFrameEx(Display display, int style) {
    super(display, style);
    createContents();
    setLayout(new FillLayout());
    }/**
    * Create contents of the window
    */
    protected void createContents() {
    setText("SWT Application");
    setSize(500, 375);final TableTreeViewer ttv = new TableTreeViewer(this, SWT.BORDER);
    ttv.getTableTree().setLayoutData(new GridData(GridData.FILL_BOTH));    // Set the content and label providers
        ttv.setContentProvider(new MyPlayerTreeContentProvider());
        ttv.setLabelProvider(new MyPlayerTreeLabelProvider());
        ttv.setInput(element);
       
        //final CellEditor[] cellEditors = new CellEditor[2];
        //cellEditors[1] = new TextCellEditor(ttv.getTableTree());
        /*ttv.setCellEditors(cellEditors);
        ttv.setColumnProperties(new String[]{"name", "value"});
        ttv.setCellModifier(new ICellModifier() {
    public boolean canModify(Object element, String property) {
    // TODO Auto-generated method stub
    Element data = (Element)element;
    if (data.getName().compareTo("folder") == 0) {
    return false;
    }
    if (data.getName().compareTo("data") == 0) {
    String strName = data.attributeValue("name");
    if (strName.compareTo("e1") == 0) {
    cellEditors[1] = new ComboBoxCellEditor(
    ttv.getTableTree(), new String[]{"v1", "v5", "v6"});
    }
    if (property.compareTo("value") == 0)
    return true;
    }
    return false;
    }public Object getValue(Object element, String property) {
    // TODO Auto-generated method stub
    Element data = (Element)element;
    return data.attributeValue("value");
    }public void modify(Object element, String property, Object value) {
    // TODO Auto-generated method stub
    Item item = (Item) ((TreeColumn) element).getData();
    if (item instanceof Element) {
    ((Element)item).setAttributeValue("value", value + "");
    }
    System.out.println(((Element)item).asXML());
    }
        });*/    // Set up the table
        TableColumn column1 = new TableColumn(ttv.getTableTree().getTable(), SWT.CENTER);
            column1.setText("Name");
            column1.setWidth(200);
            TableColumn column2 = new TableColumn(ttv.getTableTree().getTable(), SWT.CENTER);
            column2.setText("Value");
            column2.setWidth(200);
        //Expand everything
        ttv.expandAll();
        // Pack the columns
        for (int i = 0, n = ttv.getTableTree().getTable().getColumnCount(); i < n; i++) {
        ttv.getTableTree().getTable().getColumn(i).pack();
        }
        // Turn on the header and the lines
        ttv.getTableTree().getTable().setHeaderVisible(true);
        ttv.getTableTree().getTable().setLinesVisible(true);
        // Pack the window
        pack();
       
        ttv.reveal(ttv.getElementAt(0));
    }@Override
    protected void checkSubclass() {
    // Disable the check that prevents subclassing of SWT components
    }
    }class MyPlayerTreeContentProvider implements ITreeContentProvider {
    private static final Object[] EMPTY = new Object[] {};public Object[] getChildren(Object parentElement) {
    // TODO Auto-generated method stub
    if (parentElement instanceof Element) {
    Object[] objs = ((Element)parentElement).elements().toArray();
    System.out.println(objs);
    return objs;
    }
    return EMPTY;
    }public Object getParent(Object element) {
    // TODO Auto-generated method stub
    return ((Element)element).getParent();
    }public boolean hasChildren(Object element) {
    // TODO Auto-generated method stub
    return getChildren(element).length > 0;
    }public Object[] getElements(Object inputElement) {
    // TODO Auto-generated method stub
    return getChildren(inputElement);
    }public void dispose() {
    // TODO Auto-generated method stub}public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    // TODO Auto-generated method stub}
    }class MyPlayerTreeLabelProvider implements ITableLabelProvider {
    public static final int COLUMN_NAME = 0;
    public static final int COLUMN_VALUE = 1;public String getColumnText(Object element, int columnIndex) {
    // TODO Auto-generated method stub
    Element data = (Element) element;
    //System.out.println(data.asXML());
    String text = "";
    switch (columnIndex) {
    case COLUMN_NAME:
    text = data.attributeValue("name");
    break;
    case COLUMN_VALUE:
    text = data.attributeValue("value");
    break;
    }return text;
    }public void addListener(ILabelProviderListener listener) {
    // TODO Auto-generated method stub}public void dispose() {
    // TODO Auto-generated method stub}public boolean isLabelProperty(Object element, String property) {
    // TODO Auto-generated method stub
    return false;
    }public void removeListener(ILabelProviderListener listener) {
    // TODO Auto-generated method stub}public Image getColumnImage(Object element, int columnIndex) {
    // TODO Auto-generated method stub
    return null;