`
zhuliyy1983
  • 浏览: 64064 次
  • 来自: ...
社区版块
存档分类
最新评论

JFace中的TableViewer

    博客分类:
  • swt
J# 
阅读更多
java基础 ---JFace中的TableViewer

在上一篇介绍了SWT/JFace窗口的建立,以及窗口的一些属性的设置。还有菜单栏的建立。下面介绍一下表格的建立。在SWT中有个Table类,用法也比较简单。但是我们一般采用的是JFace中的TableViewer来建立一个表格。我们可以从API文档中看到,SWT的Table和JFace的TableViewer并不是继承关系,他们属于两条不同的继承链。但是从TableViewer的源代码中可以发现,TableViewer把Table作为一个实例变量,也就是说TableViewer是对Table的一种扩展。关于数据传输类的建立这些就暂不做介绍了,我们直达正题,建立一个表格,并在其中显示出数据。建立TableViewer需要几个步骤,一般只要按照这个步骤来做Table,那就没什么大的问题了。
1、 建立TableViewer对象,定义Table的式样,和SWT中其他的式样用法是一样的。
2、 将TableViewer置于容器中,并对其布局,这个和其他SWT组件是一样的。
3、 创建TableViewer中的标题,就是Header
4、 设置内容器
5、 设置标签器
6、 用setInput方法将数据显示在表格中。

经过上面6步,表格就基本上建立完成了。这里要说明一下什么是内容器和标签器。Jface的TableViewer把写入数据封装成了2个接口,一个就是内容器接口IStructuredContentProvider,还有个就是标签器接口ITableLabelProvider。我们需要实现这两个接口的两个方法才能将数据写入到表格中。内容器是接收到1个Object对象,这个Object对象可以是容器类对象或者数组,然后返回一个一维Object数组。他的作用就是通过传递进来的参数来自动设置表格中的数据需要占多少行。标签器接口中的getColumnText方法参数是1个object对象和需要写入数据的列数,返回一个String对象。他的作用相当于把每个字段的值写入到表格中。当我们实现了这些方法后,这些方法该如何调用是不需要我们关心的,你只要保证传进来的参数不会出现问题那就行了。我们只需要在程序中创建这两个类的对象,然后将他们作为TableViewer的setContentProvider()和setLabelProvider()这两个方法的参数就行了,最后将要放入表格的集合类对象或者数组作为setInput()的参数,表格的数据显示就完成了。

SWT中的布局管理器我这里就不多讲了,有兴趣可以翻翻这方面的资料,比较的常用的还是GridLayout和FormLayout,这两个布局管理器是SWT中最复杂也是最强大的两个布局管理器,无论你是选择这两种中的哪一种,完全可以设计出任何复杂的界面。GridLayout是按行和列来排列组件的,他主要是用在窗体大小固定不变的时候,如果窗体大小会发生变化,那使用这个布局管理器就显得有点力不从心了。我还是比较倾向于使用FormLayout,因为这个管理器是按位置的百分比来设置组件的位置,也可以相对于某个组件来排列,用它来管理布局界面,可以让我们的界面排列方式更加细致。尽管他使用起来还要复杂点。下面将演示如何建立表格,并通过相应的按钮向里面一行一行的添加数据。还可以对表格的所有数据进行清空以及显示。双击表格中的数据时会弹出窗口显示当前选中行的第0列字段的值。在大多数例子中都只演示了如何通过集合类,如List,Set,Map等将数据写入到表格中,我这里演示一下如将二维数组写入表格中。

将下面的代码替换上篇文章中主窗口类的createContents方法,下面还有个监听器的方法,写在这个方法的下面也可以

protected Control createContents(Composite pare) {

    // 获得窗口的shell对象
    Shell shell = this.getShell();
    Toolkit kit = Toolkit.getDefaultToolkit();
    // 设置窗口标题
    shell.setText("我的通讯录-授权:Administrator");
    // 设置窗口默认大小
    shell.setSize(700, 400);
    // 将窗口居中
    shell.setLocation((kit.getScreenSize().width - 700) / 2, (kit
            .getScreenSize().height - 400) / 2);
    MenuManager popMenu = new MenuManager();
    popMenu.add(new OpenFile());
    popMenu.add(new SaveFile());
    Menu menu = popMenu.createContextMenu(pare);
    pare.setMenu(menu);
    
    //创建FormLayout布局管理器对象
    FormLayout form = new FormLayout();
    //将pare容器按照FormLayout来布局
    pare.setLayout(form);
    //通过JFaceTable类的creatTableViewer()创建一个TableViewer对象
    final TableViewer tableViewer = new JFaceTable().creatTableViewer(pare);
    //设置TableViewer内容器
    tableViewer.setContentProvider(new JFaceTable().new TableViewerContentProvider());
    //设置TableViewer标签器
    tableViewer.setLabelProvider(new JFaceTable().new TableViewerLabelProvider());
    //增加表格中双击事件,可以获得当前选择行的第一列字段的值。
    tableViewer.addDoubleClickListener(new IDoubleClickListener(){
        public void doubleClick(DoubleClickEvent e) {
            TableItem item = tableViewer.getTable().getItem(tableViewer.getTable().getSelectionIndex());
            MessageDialog.openInformation(null,"提示",item.getText(0));
        }
    });
    
    //创建FormLayout布局管理器的布局数据类对象
    FormData formData = new FormData();
    //FormAttachment是FormData更进一步的布局数据类
    //该组件左边距他父容器左边距离的百分比。第二个参数是偏移量
    formData.left = new FormAttachment(0, 5);
    //该组件右边距他父容器左边距离的百分比
    //这里设置的时候左边一定要比右边的百分比小,否则组件就会看不见了。
    formData.right = new FormAttachment(100, -5);
    //该组件上边距他父容器上面距离的百分比
    formData.top = new FormAttachment(0, 5);
    //该组件下边距他父容器上面距离的百分比
    //这里设置的时候上边一定要比下边的百分比小,否则组件就会看不见了。
    formData.bottom = new FormAttachment(100, -80);
    //获得tableViewer的Table对象
    //因为在TableViewer里面包含有Table,所以我们依然可以在TableViewer
    //上使用Table类的方法,不过要先获得该TableViewer对象的table对象
    Table table = tableViewer.getTable();
    //将这个布局数据类应用于table
    table.setLayoutData(formData);
    //建立一个带有标题文字和边框的容器
    Group group = new Group(pare, SWT.NONE);
    group.setText("控制区");
    formData = new FormData();
    formData.left = new FormAttachment(0, 5);
    formData.right = new FormAttachment(100, -5);
    formData.top = new FormAttachment(table, 5, SWT.BOTTOM);
    formData.bottom = new FormAttachment(100, -5);
    group.setLayoutData(formData);

    GridLayout grid = new GridLayout();
    grid.numColumns = 2;

    group.setLayout(grid);
    Button button_1 = new Button(group, SWT.NONE);
    button_1.setText("  增加  ");
    GridData gridData = new GridData();
    gridData.grabExcessHorizontalSpace = true;
    gridData.horizontalAlignment = GridData.CENTER;
    button_1.setLayoutData(gridData);
    //建立按钮的事件监听器
    button_1.addSelectionListener(new Selection(tableViewer, button_1));

    Button button_2 = new Button(group, SWT.NONE);
    button_2.setText("  清空  ");
    gridData = new GridData();
    gridData.grabExcessHorizontalSpace = true;
    gridData.horizontalAlignment = GridData.CENTER;
    button_2.setLayoutData(gridData);
    button_2.addSelectionListener(new Selection(tableViewer, button_2));
    // .
    // .
    // .
    return pare;

}

private class Selection extends SelectionAdapter {

    private TableViewer tv;

    private Object button;

    public Selection(TableViewer tv, Object button) {

        this.tv = tv;
        this.button = button;
    }

    public void widgetSelected(SelectionEvent e) {

        String str = ((Button) e.getSource()).getText();

        if (str.equals("  增加  ")) {
            Object[][] object = new Object[1][4];
            for (int i = 0, j = index + 1; i < object[0].length; i++)
                object[0][i] = Integer.toString(j);
            /* tableViwer的添加行的方法,这个方法可以将数据
             * 添加到表格中,并且不会影响到表格中其他的数据,
             * 而如果使用setInput会把以前在表格中的数据全部替换掉,
             * 当然如果你再使用getInput(),那么只能获得以前使用
             * setInput时添加的数据,而后面使用add方法添加的数据
             * 是不会被获得的。*/
            tv.add(object);
            index++;
        }
        if (str.equals("  清空  ")) {
            if (tv.getTable().getItemCount() != 0) {

                index = tv.getTable().getItemCount();
                /* removeAll()是Table的方法,将当前表格中
                 * 所有的数据全部清空*/
                tv.getTable().removeAll();
                ((Button) button).setText("  显示  ");

            }
        }
        if (str.equals("  显示  ")) {

            Object[][] object = new Object[index][4];
            for (int i = 0; i < object.length; i++) {
                for (int j = 0; j < 4; j++) {
                    object[i][j] = i + 1;
                }
            }
            tv.setInput(object);
            ((Button) button).setText("  清空  ");

        }
    }
}


/****************文件名:JFaceTable.java****************/

public class JFaceTable {

    /* 用于实现IStructuredContentProvider接口,此接口一般都只
     * 用实现getElements()这个方法,其他的方法为空就行了*/
    class TableViewerContentProvider implements 
                            IStructuredContentProvider{
        
        /* 这里的参数就是我们使用setInput()传进的参数,因为我使用的是数组
         * 所以接受的参数也是二维数组。
         */
        public Object [] getElements(Object element) {
            
            //因为该方法不能返回null,所以要先判断一下数据的正确性,否则会
            //报异常。
            if (element instanceof Object [])
            {
                //首先将此参数转换成一维数组
                return (Object []) element;
            }
            else
            {
                return new Object [0];
            }
        }
        /* 下面的方法可以设置为空*/
        public void dispose() {}

        public void inputChanged(Viewer arg0, Object arg1, Object arg2) {}
        
    }
    
    /* 用于实现ITableLabelProvider接口,此接口一般都只
     * 用实现getElements()这个方法,其他的方法为空就行了*/
    class TableViewerLabelProvider implements ITableLabelProvider{
        /* 这里的element参数,其实就是我们二维数组中的每一个一维数组,其中保存的是
         * 每一行的所有数据,通过column这个参数依次写入到表格中的各个字段上。
         * column具体值是多少我们并不知道,因此需要我们来判断,并根据他里面的值
         * 来决定我们要将哪个数据返回。同样,该方法是不能返回NULL的。必须先检查数
         * 有效性。*/
        public String getColumnText(Object element, int column) {

            if (element instanceof Object [])
            {
                for (int i = 0; i < ((Object []) element).length; i++)
                {
                    if (column == i)
                    {
                        return ((Object []) element)[column].toString();
                    }
                }
            }
            return "";
        }
        
        public Image getColumnImage(Object arg0, int arg1) {
            
            return null;
        }

        public void addListener(ILabelProviderListener arg0) {}

        public void dispose() {}

        public boolean isLabelProperty(Object arg0, String arg1) {

            return false;
        }

        public void removeListener(ILabelProviderListener arg0) {}
        
    }
    /* 下面的方法就是用于创建TableViewer对象的,并返回给主窗口*/
    public TableViewer creatTableViewer(Composite pare){
        
        //创建TableViewer对象,这里有几个式样。BORDER:有边框|MULTI:可以多选
        //FULL_SELECTION整行选择。
        TableViewer tableViewer = new TableViewer(pare,SWT.BORDER|SWT.MULTI|SWT.FULL_SELECTION);
        //获得TableViewer的table对象,并在后面设置他的表头是否显示,
        //是否具有表格线。
        Table table = tableViewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        //设置table的专有表格布局管理器。
        TableLayout tableLayout = new TableLayout();
        table.setLayout(tableLayout);
        
        //下面都是设置表头上的文字和每一列表格占的比例宽。
        tableLayout.addColumnData(new ColumnWeightData(10));
        new TableColumn(table,SWT.NONE).setText("序号");
        tableLayout.addColumnData(new ColumnWeightData(10));
        new TableColumn(table,SWT.NONE).setText("姓名");
        tableLayout.addColumnData(new ColumnWeightData(10));
        new TableColumn(table,SWT.NONE).setText("性别");
        tableLayout.addColumnData(new ColumnWeightData(10));
        new TableColumn(table,SWT.NONE).setText("年龄");
        return tableViewer;
    }
}
分享到:
评论

相关推荐

    Plugins-JFace-TableViewer.rar

    Plugins-JFace-TableViewer.rar Plugins-JFace-TableViewer.rar Plugins-JFace-TableViewer.rar Plugins-JFace-TableViewer.rar Plugins-JFace-TableViewer.rar

    Swt/Jface tableViewer入门教程一(显示tableViewer)

    在本文中,我们将深入探讨如何使用Swt/Jface库中的`tableViewer`组件来创建一个基本的表格视图。Swt(Standard Widget Toolkit)是Java中用于开发原生界面的应用程序开发工具包,而Jface是建立在Swt之上的抽象层,...

    swt/jface tableViewer开发简化

    本篇文章将聚焦于SWT/JFace中的tableViewer组件的开发与简化。 首先,`tableViewer`是JFace库中用于展示表格数据的核心组件。它为开发者提供了一种方便的方式来显示和操作数据,同时处理了诸如排序、过滤等复杂功能...

    Swt/Jface tableViewer入门教程三(加入在表格上直接编辑数据)

    在本文中,我们将深入探讨如何使用Swt/Jface库中的`TableViewer`组件来创建一个功能丰富的表格,并实现用户可以直接在表格上编辑数据的功能。Swt/Jface是Eclipse平台的一部分,提供了一套用于构建图形用户界面(GUI...

    JFace TableViewer的单元格逐个遍历的辅助类

    点击Enter键,对TableViewer的单元格进行逐个遍历的辅助类,推荐用于使用ViewerColumn.setEditingSupport的可编辑TableViewer。 Since 3.3, an alternative API is available, see ViewerColumn.setEditingSupport...

    Tableviewer实现

    `TableViewer`是Eclipse提供的一个高级表格视图组件,它是`JFace Data Binding`包的一部分。`TableViewer`基于SWT(Standard Widget Toolkit)的`Table`控件,但提供了更多的功能和灵活性,使得数据绑定和表格操作变...

    swt agile grid 学习示例

    Agile Grid在实现时充分借鉴了Eclipse JFace中TableViewer的设计模式,同时对表格控件的灵活性和可扩展性做了增强设计,开发者可依据具体应用的需要对Agile Grid的布局、煊染、编辑、键盘导航等进行灵活定制。

    swt/jface api帮助文档

    JFace的TableViewer和TreeViewer提供了一种更抽象的方式来操作这些组件,包括数据绑定和排序。 7. **JFace服务**:包括Dialog、WorkbenchWindow、Action、SelectionService等,它们简化了窗口、动作和选择事件的...

    全面介绍SWT-JFace

    4. **表和树的数据视图**:JFace的TableViewer和TreeViewer提供了对表格和树形结构数据的高级支持,包括排序、过滤和分页等功能。 5. **视图和编辑器**:在Eclipse IDE中,JFace用于创建可复用的视图和编辑器组件,...

    swt_jface_celleditor

    `swt_jface_celleditor` 标题和描述所涉及的知识点主要围绕如何在SWT/JFace中的TableViewer组件实现单元格的编辑功能,包括Text、Combo以及FileDialog这三种不同的编辑样式。 首先,SWT是Eclipse项目的一部分,它...

    Setting focus cell in TableViewer

    描述中提到的链接指向了张江芳在iteye.com上的博客文章,尽管具体内容没有提供,但我们可以推测这篇文章可能讲解了如何在TableViewer中实现焦点单元格的设置和导航。在处理用户输入或自动流程时,能够正确设置和切换...

    SWT+JFace 源代码

    1. **视图和编辑器**:JFace为构建Eclipse插件中的视图和编辑器提供了基础框架,使开发者能够专注于业务逻辑,而不是UI细节。 2. **数据绑定**:JFace提供了强大的数据绑定框架,使得UI元素和模型数据之间可以自动...

    Set TableViewer Cell Focus

    "Set TableViewer Cell Focus"这个话题是关于如何在TableViewer中设置焦点到特定单元格上,这对于实现用户交互和数据编辑功能至关重要。在Eclipse插件开发或者基于SWT(Standard Widget Toolkit)的应用程序中,...

    swt jface_API_CHM.zip

    5. **Table and Tree Viewer**: JFace的TableViewer和TreeViewer是对SWT表格和树组件的增强,提供了更多的功能,如排序、过滤、分页,以及与模型数据的紧密集成。 6. **Action Framework**: JFace的动作框架允许...

    The.Definitive.Guide.to.SWT.and.JFace.eBook-LiB

    例如,JFace的TableViewer和TreeViewer使得在表格和树形结构中展示数据变得更为简单。 Eclipse RCP是基于这些组件构建的强大框架,允许开发者创建功能丰富的桌面应用。RCP提供了插件体系结构,允许应用程序模块化,...

    Manning - SWT JFace in Action

    5. 表和树视图:使用JFace的TableViewer和TreeViewer来展示复杂的数据结构。 6. 视图和编辑器:理解Eclipse工作台的工作原理,创建自定义视图和编辑器。 7. 性能优化:学习如何避免SWT和JFace中的常见性能问题,提高...

    org.eclipse.jface.rar

    1. **Viewers**:JFace提供了一种模型-视图-控制器(MVC)的实现,用于构建可定制的数据查看器,如TreeViewer和TableViewer。它们允许开发者以树形或表格形式展示数据,并提供了丰富的操作,如排序、过滤和编辑。 2...

    jface 入门例子

    2. **Viewer Framework**:JFace的`TableViewer`和`TreeViewer`提供了强大的表格和树形视图管理,支持数据模型、过滤、排序等功能。例如,创建一个表格展示数据: ```java Table table = new Table(shell, SWT....

    JFace一些资料

    JFace是Eclipse框架中的一部分,它是构建用户界面(UI)的一种高级工具包。JFace的设计目标是提供一个面向对象的、与操作系统无关的接口,简化Swing和SWT(Standard Widget Toolkit)之间的开发差异,使得开发者能够...

    SWT中自己订制了一个TableViewer(用于我的列出项目中的所有错误信息),作为测试用的。与大家分享

    TableViewer是SWT JFace库中的一个组件,它为 SWT 的 Table 控件提供了一种数据绑定和视图操作的能力。通过TableViewer,我们可以轻松地将数据模型与表视图关联起来,实现数据的动态更新和交互。 首先,我们需要...

Global site tag (gtag.js) - Google Analytics