RCP开发浅谈之SWT,JFACE

RCP开发浅谈之SWT,JFACE

  • SWT

    什么是SWT?

    SWT全名是Standard Widget Toolkit是一个开源的GUI编程框架,我们每一个java开发者,在学习java开发的时候都会接触到awt以及swing这两个图形库,与awt,swing两个图形库不同,swt的优势体现于底层调用本地的图形库,大大提高了运行速度(损失了一定跨平台性)。SWT的一个很重要的一点,一个控件并不是单独存在的,而是存在于父控件中。这样当父控件disposed后,子控件也一定很disposed了。每一个swt控件的构造函数,都要依托于一个parent容器。

Table table = new Table(parent,SWT.MULTI|SWT.H_SCROLL);
  • JFACE

    既然有了SWT,为什么会有JFACE的诞生呢?当然是为了弥不了对视图层,控制层,数据层的隔离,进行了MVC的封装。比如数据来源就是Model.通过

tableViewer.setInput(objs);

数据如何组织(Controller)

tableViewer.setContentProvider(new ArrayContentProvider)

数据如何显示(Viewer)

tableViewer.setLabelProvider(..);

table展示数据依赖于索引,jface封装了很多方法,你只需传入一些对象就可玩成对数据的过滤,排序,组织等功能。

下面是一个具体table和tableviewer的demo:

依赖于5个包:

import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import com.google.common.collect.Lists;

class People {
    String name;
    String age;
    int index;

    public People(int index, String name, String age) {
        this.name = name;
        this.age = age;
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }

    public int getIndex() {
        return index;
    }

}

public class Demo {

    public static void main(String[] args) {
        Display display = Display.getDefault();
        Shell shell = new Shell(display);
        shell.setMaximized(true);
        shell.setLayout(new GridLayout(2, false));
        Table table = new Table(shell, SWT.MULTI | SWT.FULL_SELECTION
                | SWT.CHECK);
        table.setToolTipText("SWT table demo");
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        createColumLabel(table);
        List<People> objs = createData();
        for (int row = 0; row < objs.size(); row++) {
            TableItem item = new TableItem(table, SWT.FILL);
            // 依赖于具体参数
            for (int col = 0; col < table.getColumnCount(); col++) {
                if (objs.get(row) != null) {
                    switch (col) {
                    case 0:
                        item.setText(col, objs.get(row).getIndex() + "");
                        break;
                    case 1:
                        item.setText(col, objs.get(row).getName());
                        break;
                    case 2:
                        item.setText(col, objs.get(row).getAge());
                    }
                }
            }
        }
        table.pack();
        TableViewer tableViewer = new TableViewer(shell, SWT.CHECK
                | SWT.FULL_SELECTION);
        createColumLabel(tableViewer);
        tableViewer.setContentProvider(new ArrayContentProvider());
        tableViewer.setInput(objs);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                continue;
            }
        }
    }

    private static void createColumLabel(Table table) {
        for (int i = 0; i < 3; i++) {
            TableColumn tc = new TableColumn(table, SWT.CENTER);
            tc.setResizable(false);
            tc.setWidth(250);
        }
    }

    private static List<People> createData() {
        List<People> peoples = Lists.newArrayList();
        peoples.add(new People(1, "Li hua", "20"));
        peoples.add(new People(2, "Wang qiang", "30"));
        peoples.add(new People(3, "Zhang wei", "40"));
        return peoples;
    }

    private static void createColumLabel(TableViewer tableViewer) {
        TableViewerColumn viewerColum1 = new TableViewerColumn(tableViewer,
                SWT.NONE);
        viewerColum1.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof People) {
                    return People.class.cast(element).getIndex() + "";
                }
                return super.getText(element);
            }
        });
        TableViewerColumn viewerColum2 = new TableViewerColumn(tableViewer,
                SWT.NONE);
        viewerColum2.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof People) {
                    return People.class.cast(element).getName();
                }
                return super.getText(element);
            }
        });
        TableViewerColumn viewerColum3 = new TableViewerColumn(tableViewer,
                SWT.NONE);
        viewerColum3.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof People) {
                    return People.class.cast(element).getAge();
                }
                return super.getText(element);
            }
        });
        TableColumn tableColumn = viewerColum1.getColumn();
        tableColumn.setResizable(false);
        tableColumn.setWidth(250);
        tableColumn = viewerColum2.getColumn();
        tableColumn.setResizable(false);
        tableColumn.setWidth(250);
        tableColumn = viewerColum3.getColumn();
        tableColumn.setResizable(false);
        tableColumn.setWidth(250);

    }

}

第一篇RCP就写到这里。。

时间: 2024-10-26 19:29:10

RCP开发浅谈之SWT,JFACE的相关文章

Android开发-浅谈架构(二)

写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应该不是这样,但是我想说的是 自从我想写一些笔记记录知识的时候 为了不误导其他人 我不得不参考github 一些比较知名大牛的代码.在这个过程中 我下载过很多demo.一点一点的啃 汲取精华的部分 当然也充满疑惑.后来觉得标题取得有点大了 我应该取"学习"类的标题才对.但是另一方面我也只能就

J1001.Java原生桌面及Web开发浅谈

自从Java问世以来,在服务端开发方面取得了巨大的发展.但是在桌面/Web开发方面,一直没有得到大的发展.从最初的AWT,到Swing,再到JavaFX,Java从来没有在桌面/Web解决方案中取得重要席位,更别提占居主导地位了. AWT AWT(Abstract Window ToolKit,抽象窗口工具包)是SUN在1996年推出的UI框架.由于需要跨平台,所以AWT只能支持主流平台共有的界面组件和特性(交集),例如标签.按钮等,这就导致了AWT在组件丰富程度以及功能性等方面必然有欠缺.AW

H5斗地主×××开发浅谈(一)

h5斗地主游戏开发Q1446595067 官网:h5.haozibbs.com去年从传统软件公司辞职,下定决心转互联网,由于对游戏的热爱,去了一家游戏公司,待了将近10个月,参与开发了一款动作卡牌手游,游戏最终也上线了.最近抽空写写过去对游戏后端的一些感想吧.最近又去另外一家游戏公司,参与开发一款MMO手游.准备开始从动作卡牌手游谈到MMO手游,也算是对游戏开发的一些感悟.动作卡牌游戏,相对而言,时延性要求没有那么高,所以架构没有那么复杂,不过也是值得学习的.本文重点介绍卡牌游戏的架构.整个后端

iOS开发--浅谈CocoaAsyncSocket编程

Socket就是一种特殊的文件.它是一个连接了两个用户的文件,任何一个用户向Socket里写数据,另一个用户都能看得到,不管这两个用户分布在世界上相距多么遥远的角落,感觉就像坐在一起传纸条一样. 这么讲Socket应该更容易理解吧?这种抽象是非常重要的,因为它屏蔽了更底层的东西,我就想写个程序发送下数据,为什么要关系物理层怎么传输呢,对吧. 所以有了Socket的概念之后,我们在两个客户端之间发送消息可能就是这样的: 指定对方的地址 打开一个和对方连接的Socket 把Socket当成普通的文件

linux服务器开发浅谈

[开发前准备] 在进行linux服务器开发之前,必须很清楚地了解所开发的对象需要考虑的相关问题比如:功能架构:提供服务的模块体系结构稳定性:服务器的出core率,内存泄露情况性能:请求与返回的速度与正确性负载能力:能同时访问的最大数量和频度 根据不同服务器对象的环境和应用,服务器开发的对应手段相差甚远.比如就客户端连接时间较短却又比较频繁的服务器(例如HTTP服务器)而言,在可选的服务器结构中,预先派生进/线程的结构就要比并发式结构高效 总之,在开发服务器之前,必须进行完整的服务器开发需求分析,

JAVAEE企业级应用开发浅谈之MVC 中的V-VIEW视图

Step1.情景概要 Hello,小伙伴们,好久不见,之前跟大家分享了三层架构与MVC思想,相信大家对于这两块内容有了相对清晰的个人认识了,既然我们讲到了MVC,这里我们接着这块内容继续往下深入,今天我们来看看MVC 中的V-VIEW 即我们所说的视图层. Step2.视图技术 对于我们WEB开发人员来说,视图的概念应该都不会很陌生了,我们在浏览网页时见到的各种形式的页面内容,背后都离不开我们所用的视图技术,对于JAVA Web 开发人员来讲,页面展示实际上就是模板+数据=页面内容,所有的web

Android Studio NDK开发浅谈

环境: Android Studio 1.1.0 NDK-r10d 1.新建项目--->包名:com.mxl.az.ndk 新建包含native方法的类:JniOperation.class public class JniOperation { public static native String getString(); public native int add(int a, int b); } 2.然后使用javah命令生成.h文件 打开“小黑框”,进入项目目录的.../app/bui

HTML5 拖放(Drag 和 Drop)功能开发——浅谈dataTransfer对象

[前言] 之前我已经为大家介绍过一篇有关HTML5中原生拖拽的相关知识了.今天为大家介绍HTML5拖拽中的其他一些关于dataTransfer对象的知识和应用. dataTransfer对象 之前的一篇文章中也有提及到dataTransfer对象,那会只是想通过dataTransfer对象来将被拖拽元素的id进行传递,使得目标元素可以通过相应的dataTransfer对象来获取id进行对应操作. 成员表 属性 描述 dropEffect 设置或获取拖曳操作的类型和要显示的光标类型. effect

vue中小型项目开发浅谈

组件的本质 组件的本质就是一个可以交互的视图模板 controller去哪了 在react中存在展示组件与容器组件,其中展示组件展示单纯的展示,而容器组件里面则是react与redux沟通的桥梁,而redux是包含业务逻辑的地方,所以controller存在于react的容器组件中,但是在vue中没有容器组件的概念,然而我们可以编写出一个容器组件,用于存在其他展示组件,这通常是一个页面或者是页面里的某个模块 是否需要model层 对于中小型项目,大部分业务逻辑都已经被node中间层给处理了,前端