通过TreeColumn实现“表格树”TableTree

Eclipse 3.1里deprecate了TableTree这个控件,与之对应的jface的TableTreeViewer虽然没有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) {
            
        }
        
    }
}

下面是运行画面:

转载于:https://www.cnblogs.com/bjzhanghao/archive/2006/03/07/344853.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建一个store来获取数据库里面的数据 ``` Ext.define('MyApp.store.TreeStore', { extend: 'Ext.data.TreeStore', alias: 'store.tree', proxy: { type: 'ajax', url: 'tree.php', //修改为你的后端接口地址 reader: { type: 'json', rootProperty: 'data' } } }); ``` 2. 创建一个tree panel并使用store加载数据 ``` Ext.define('MyApp.view.TreePanel', { extend: 'Ext.tree.Panel', xtype: 'treepanel', requires: [ 'MyApp.store.TreeStore' ], store: { type: 'tree' }, rootVisible: false, columns: [ { xtype: 'treecolumn', dataIndex: 'text', flex: 1 } ] }); ``` 3. 编写后端接口返回数据 ``` <?php //连接数据库 $conn = new mysqli("localhost", "root", "", "test"); //查询数据 $result = $conn->query("SELECT id, text, parent_id FROM tree"); //将查询结果转换为形结构 $data = array(); while ($row = $result->fetch_assoc()) { $data[$row['id']] = array( 'id' => $row['id'], 'text' => $row['text'], 'parent_id' => $row['parent_id'], 'children' => array() ); } $tree = array(); foreach ($data as &$node) { if ($node['parent_id'] != null) { $data[$node['parent_id']]['children'][] = &$node; } else { $tree[] = &$node; } } //返回形结构数据 echo json_encode(array( 'success' => true, 'data' => $tree )); ``` 4. 修改数据库中的数据 如果要修改数据库中的数据,可以在节点的编辑事件中发送请求到后端接口,将修改后的数据保存到数据库中,然后重新加载数据即可。 ``` listeners: { edit: function (editor, context) { //获取修改后的数据 var record = context.record, newData = record.getData(); //发送请求保存到数据库 Ext.Ajax.request({ url: 'update.php', //修改为你的后端接口地址 method: 'POST', params: newData, success: function (response) { Ext.toast('保存成功'); }, failure: function (response) { Ext.toast('保存失败'); } }); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值