`
snoopy7713
  • 浏览: 1149346 次
  • 性别: 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....

    JFace-TableTree的若干问题.doc

    在Windows XP上,TableTree组件在展开或收缩节点时,列宽会保持不变,但在OS X中,当树节点被展开时,包含树的列会自动扩展,导致后续的列部分隐藏在Sash(分割条)下面。这个问题出现的原因可能与不同操作系统下...

    EXTJS动态树的实现举例示例代码

    在EXTJS中,动态树的实现主要依赖于`Ext.tree.Panel`类和`Ext.data.TreeStore`类。`TreeStore`负责管理树的数据源,而`TreePanel`则用于展示这些数据。以下是一个简单的EXTJS动态树实现的步骤: 1. **定义数据模型...

    Extjs的tree

    ExtJS的Tree组件是Sencha ExtJS框架中的一个重要部分,用于构建可交互的树形结构数据展示。在ExtJS中,TreePanel是用来显示和操作树形数据的主要组件,它可以用于组织层次化的信息,如文件系统、组织架构或者分类...

    4.0Ext 树型结构

    树面板与数据存储之间的交互通过节点接口(The Node Interface)实现。这个接口封装了模型实例,提供了额外的方法和属性来适应树控件的特殊状态。例如,你可以改变树的外观,通过设置`useArrows`为`true`来隐藏边线...

    ext复选框的ColumnTree扩展包

    在发送请求前,你需要获取当前选中的节点信息,这可以通过遍历树结构并检查每个节点的`checked`属性来完成。 总的来说,"ext复选框的ColumnTree扩展包"为EXT的ColumnTree组件提供了增强的功能,使得在树形数据结构...

    treegrid的使用详解

    总结,TreeGrid是jQuery库中的一个强大工具,它通过树形结构展示表格数据,使得信息层次更清晰。理解并掌握JSON数据格式、配置选项以及基本的实现方法,是有效利用TreeGrid的关键。在实际项目中,可以根据需要对...

    Extjs之tree

    Tree组件是ExtJS中的一个核心组件,它能够以可交互的树形结构展示数据。每个节点都可以包含子节点,并且可以通过展开和折叠操作来控制显示的层次。Tree组件不仅支持静态数据,也支持动态加载数据,即按需加载节点。 ...

    swt创建tree的例子

    在实际应用中,你可以通过递归或者循环来动态加载大量数据,或者自定义TreeColumn来展示多列数据。SWT还提供了许多高级特性,如Tree的拖放操作、图像支持、检查框等等,可以根据需求进行深入学习和使用。

    Extjs4的TreeGrid例子

    TreeGrid是ExtJS提供的一种复合组件,它结合了树形视图和数据网格的功能,允许用户同时展示层次结构数据和表格数据。在"Extjs4的TreeGrid例子"这个主题中,我们将深入探讨TreeGrid的各种特性,以及如何在实际项目中...

    SWT扩展

    通过`TableColumn`和`TreeColumn`可以定义列的显示属性,而`TableItem`和`TreeItem`则用于添加和管理具体的数据项。 **3. 图形与图像** SWT的`GC`(Graphics Context)类允许开发者进行复杂的图形绘制,包括直线、...

    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...

    ext TreeGrid分页可编辑

    在Web应用开发中,特别是涉及到复杂数据展示的应用场景中,`Ext TreeGrid`是一种非常实用且灵活的数据展示组件,它结合了树形结构与表格的形式来呈现数据,非常适合展示具有层次关系的数据集合。本文主要探讨如何...

    TreePanel基本使用

    EXT是Sencha公司开发的一款强大的JavaScript前端框架,用于构建富客户端Web应用。它提供了一整套组件化的UI元素,使得开发者能够轻松...实际应用中,开发者可以根据需求灵活配置和扩展,以实现更复杂的树形视图功能。

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

    JavaScript中的事件处理是Web开发中的核心概念,它允许开发者响应用户的交互。...这两种模型都是为了解决早期Netscape事件处理方式的问题,即无法绑定多个事件处理函数。 **W3C模型** W3C DOM层面的事件规范提出了`...

    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