`
snoopy7713
  • 浏览: 1129191 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

通过TreeColumn实现“表格树”TableTree

    博客分类:
  • SWT
阅读更多

Eclipse 3.1deprecateTableTree这个控件,与之对应的jfaceTableTreeViewer虽然没有deprecate,但使用它会得到很多警告。在TableTreeViewer的第一列里是不能显示图标的,因为这个位置被+/-符号占用了,而且TableTree是显示不出 Tree的层次的,也就是没有缩进。

SWT 3.1里的Tree控件新支持了列的显示,是通过TreeColumn来实现的。在jface里则没有添加新的viewer,使用原先的TreeViewer即可支持,下面是一段例子代码,注意如果在windows里运行要修改一下setInput()这条语句的参数,例如改为setInput(new File("c:"""))

 

import java.io.File;

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.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TreeColumn;


public class TreeColumnTest {
    
    public void run(){
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        
        final TreeViewer viewer = new TreeViewer(shell, SWT.FULL_SELECTION);
        viewer.getTree().setHeaderVisible(true);
        TreeColumn column = new TreeColumn(viewer.getTree(), SWT.LEFT);
        column.setText("Name");
        column.setWidth(200);
        column = new TreeColumn(viewer.getTree(), SWT.LEFT);
        column.setText("Size");
        column.setWidth(100);
        column = new TreeColumn(viewer.getTree(), SWT.LEFT);
        column.setText("Hidden");
        column.setWidth(100);
        viewer.setContentProvider(new MyTreeContenetProvider());
        viewer.setLabelProvider(new MyTableLableProvider());
        viewer.setInput(new File("/"));

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

    public static void main(String[] args) {
        new TreeColumnTest().run();
    }
    
    class MyTreeContenetProvider implements ITreeContentProvider{

        public Object[] getChildren(Object parentElement) {
            File file=(File)parentElement;
            if(file.isDirectory())
                return file.listFiles();
            else
                return null;
        }

        public Object getParent(Object element) {
            File file=(File)element;
            return file.getParentFile();
        }

        public boolean hasChildren(Object element) {
            File file=(File)element;
            return file.isDirectory()/*&&file.list().length>0*/;
        }

        public Object[] getElements(Object inputElement) {
            File file=(File)inputElement;
            return file.isDirectory()?file.listFiles():new Object[]{file};
        }

        public void dispose() {
            
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            
        }
        
    }
    
    class MyTableLableProvider implements ITableLabelProvider{

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            File file=(File)element;
            switch (columnIndex) {
            case 0:
                return file.getName();
            case 1:
                return ""+file.length();
            case 2:
                return ""+file.isHidden();
            default:
                return "";
            }
        }

        public void addListener(ILabelProviderListener listener) {
            
        }

        public void dispose() {
            
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
            
        }
        
    }
}
 这是运行画面:

向已有的TreeViewerTableViewer上添加编辑功能,可以使用CellEditorCellModifier

CellEditor定义了某个列被编辑时显示的外观,它可以是文本框、下拉列表框或单选框,也可以自己定义。

通常使用的CellEditor的子类就是:CheckboxCellEditorComboBoxCellEditorTextCellEditor
CellEditor
一般用数组来保存,如果某个列不需要编辑,则可将该列的CellEditor设为null
CellEditor的数组定义完后,即可利用setCellEditors(CellEditor[] editors)方法将该数组设置到对应的TreeViewerTableViewer中去。例如:

 CellEditor[] cellEditors  =   new  CellEditor[ 5 ];
    cellEditors[ 0 ]  =   new  TextCellEditor(tableViewer.getTable());
    cellEditors[ 1 ]  =   null ;
    cellEditors[ 2 ]  =   new  ComboBoxCellEditor(tableViewer.getTable(),  new  String[]{ " first " ,  " second " ,  " third " ,  " forth " });
    cellEditors[ 3 ]  =   new  CheckboxCellEditor(tableViewer.getTable());
    cellEditors[ 4 ]  =   new  CustomizedTextCellEditor(tableViewer.getTable());
    tableViewer.setCellEditors(cellEditors);

 其中CustomizedTextCellEditor是自定义的CellEditor,避免了设置value时造成的空指针异常。

protected class CustomizedTextCellEditor extends TextCellEditor{
    public CustomizedTextCellEditor(Composite parent){
        super(parent);
    }
    protected void doSetValue(Object value) {
        if(value == null)
            return;
        super.doSetValue(value);
    }        
}
 CellEditor负责外观,它对要编辑的模型信息一无所知。所以jface中引入了ICellModifier接口,将modelCellEditor联系在一起。为了确定在CellModifier中的列,需要定义columnPropertiesString[]数组,用以区分不同列对应的不同属性。使用setColumnProperties(String[] columnProperties)设置该属性集。

ICellModifier定义了三个接口方法:

public boolean canModify(Object element, String property);
该方法判断何时该列可以被编辑。其中element是对应的model。返回true表示此时该列可以被编辑。

public Object getValue(Object element, String property);
该方法一般在activateCellEditor()时调用,用于设定CellEditor的初始值。其中element是对应的model

此处虽然可以返回Object类型的引用,但是使用时需小心,特定的CellEditor仅接受特定类型的Value。比如:
TextCellEditor
对应String类型的Value
ComboBoxCellEditor
对应Integer类型的Value
CheckBoxCellEditor
对应Boolean类型的Value
若返回了不适合的Value对象,则会抛出AssertionFailedException

public void modify(Object element, String property, Object value);
该方法执行保存修改。一般在saveEditorValue之类的方法中调用。此处的element不再是model,而是Item类型的引用。取用对应的模型,需要使用((Item) element).getData()方法。一般此处的value值,也就是当前CellEditorValue值,使用CellEditor.getValue()得到。另外,在执行完更改后,需要刷新对应的TableViewerTreeViewer,使做出的更新可见。

org.eclipse.debug.internal.ui.elements.adapters.DefaultVariableCellModifier
ICellModifier的一个完整实现:

import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.DefaultLabelProvider;
import org.eclipse.debug.internal.ui.VariableValueEditorManager;
import org.eclipse.debug.ui.actions.IVariableValueEditor;
import org.eclipse.jface.viewers.ICellModifier;

/**
 * @since 3.2
 *
 */
public class DefaultVariableCellModifier implements ICellModifier {
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
     */
    public boolean canModify(Object element, String property) {
        if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
            if (element instanceof IVariable) {
                return ((IVariable) element).supportsValueModification();
            }
        }
        return false;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
     */
    public Object getValue(Object element, String property) {
        if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
            if (element instanceof IVariable) {
                IVariable variable = (IVariable) element;
                try {
                    return DefaultLabelProvider.escapeSpecialChars(variable.getValue().getValueString());
                } catch (DebugException e) {
                    DebugUIPlugin.log(e);
                }
            }
        }
        return null;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
     */
    public void modify(Object element, String property, Object value) {
        Object oldValue = getValue(element, property);
        if (!value.equals(oldValue)) {
            if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property)) {
                if (element instanceof IVariable) {
                    IVariable variable = (IVariable) element;
                    IVariableValueEditor editor = VariableValueEditorManager.getDefault().getVariableValueEditor(variable.getModelIdentifier());
                    if (value instanceof String) {
                        value = DefaultLabelProvider.encodeEsacpedChars((String)value);
                    }
                    if (editor != null) {
                        if  (editor.saveVariable(variable, (String) value, DebugUIPlugin.getShell())) {
                            return;
                        }
                    }
                    try {
                        variable.setValue((String) value);
                    } catch (DebugException e) {
                        DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), Messages.VariableColumnPresentation_4, Messages.VariableColumnPresentation_5, e.getStatus());
                    }
                }
            }
        }
    }

}
 
分享到:
评论

相关推荐

    extjs 可编辑的表格树 Ext.tree.ColumnTree Ext.tree.ColumnTreeEditor

    extjs 可编辑的表格树,每个单元格自定义编辑组件,可以自适应列宽,只有源码与例子,运行实例要修改路径,不然图片不能显示,注意etree.jsp的js引入路径 支持Ext2.x以上版本 如运行不了EmailTo : codeme9@gmail....

    Ext Js权威指南(.zip.001

    7.5.11 树节点:ext.data.nodeinterface与ext.data.tree / 364 7.5.12 store的方法 / 366 7.5.13 store的事件 / 368 7.5.14 store管理器:ext.data.storemanager / 369 7.6 综合实例 / 369 7.6.1 远程读取json...

    JavaScript Event学习第五章 高级事件注册模型

    在这一章我会讲解两种高级时间注册模型:W3C和微软的。因为这两个方法都不能跨浏览器,所以在现在看来他们的使用场合并不多。

    org.eclipse.swt.win32

    org.eclipse.swt.custom.TableTree.class org.eclipse.swt.custom.TableTreeEditor.class org.eclipse.swt.custom.TableTreeItem.class org.eclipse.swt.custom.TextChangeListener.class org.eclipse.swt.custom....

    Next Suite VCL v.6.0.60 D6-XE10.2

    Including treeColumn, a default column that can be added and modified like any other column. Support for Unicode string (WideString) in cell, header, and footer Supports both Delphi (VCL) Visual ...

Global site tag (gtag.js) - Google Analytics