使用Eclipse RCP进行桌面程序开发(三):视图和透视图_eclipse rcp 打开透视图-程序员宅基地

技术标签: Java  eclipse rcp  eclipse/Java  rcp  

使用Eclipse RCP进行桌面程序开发(一):快速起步 
使用Eclipse RCP进行桌面程序开发(二):菜单、工具栏和对话框 

Eclipse RCP开发中,和用户进行交互最多的界面,应该是视图了,而透视图就是将已有的视图、菜单、工具栏、编辑器等等进行组合和布局。看完这一节,我们就可以建立如下图这样的程序界面了。

rcp25.JPG

首先我们来介绍一下视图,建立一个视图其实非常简单,只要从org.eclipse.ui.part.ViewPart继承一个类,然后在plugin.xml中进行视图的配置。其中,向视图中添加控件的操作,我们即可以手工编写,也可以使用Designer插件,我这里推荐大家使用Designer插件,该插件对RCP提供功能非常强大的支持,如果使用Designer插件开发视图,则plugin.xml文件也不需要我们手动修改了。

比如我们上图中的第一个视图,就是从ViewPart继承一个类,然后在上面加入了几个swt的控件,做得非常得简单,而它的配置文件如下:
1 < extension
2           point ="org.eclipse.ui.views" >
3        < view
4              class ="cn.blogjava.youxia.views.FirstView"
5             id ="cn.blogjava.youxia.views.FirstView"
6             name ="第一个View" />
7 </ extension >

可以看到,实现这个视图的class为cn.blogjava.youxia.views.FirstView,那么我们看看FirstView.java吧:
 1 package cn.blogjava.youxia.views;
 2
 3 import org.eclipse.jface.action.IMenuManager;
 4 import org.eclipse.jface.action.IToolBarManager;
 5 import org.eclipse.jface.viewers.TableViewer;
 6 import org.eclipse.swt.SWT;
 7 import org.eclipse.swt.widgets.Composite;
 8 import org.eclipse.swt.widgets.Label;
 9 import org.eclipse.swt.widgets.Table;
10 import org.eclipse.swt.widgets.Text;
11 import org.eclipse.ui.part.ViewPart;
12
13 public  class FirstView  extends ViewPart  {
14
15    private Table table;
16    private Text text_1;
17    private Text text;
18    public static final String ID = "cn.blogjava.youxia.views.FirstView"; //$NON-NLS-1$
19
20    /**
21     * Create contents of the view part
22     * @param parent
23     */

24    @Override
25    public void createPartControl(Composite parent) {
26        Composite container = new Composite(parent, SWT.NONE);
27
28        final Label label = new Label(container, SWT.NONE);
29        label.setText("姓名:");
30        label.setBounds(56, 41, 36, 12);
31
32        text = new Text(container, SWT.BORDER);
33        text.setBounds(98, 38, 80, 15);
34
35        final Label label_1 = new Label(container, SWT.NONE);
36        label_1.setText("性别:");
37        label_1.setBounds(212, 41, 30, 12);
38
39        text_1 = new Text(container, SWT.BORDER);
40        text_1.setBounds(252, 38, 80, 15);
41
42        final TableViewer tableViewer = new TableViewer(container, SWT.BORDER);
43        //tableViewer.setInput(new Object());
44        table = tableViewer.getTable();
45        table.setBounds(56, 75, 374, 143);
46        table.setItemCount(10);
47        table.setLinesVisible(true);
48        //
49        createActions();
50        initializeToolBar();
51        initializeMenu();
52            }

53
54    /**
55     * Create the actions
56     */

57    private void createActions() {
58        // Create the actions
59    }

60
61    /**
62     * Initialize the toolbar
63     */

64    private void initializeToolBar() {
65        IToolBarManager toolbarManager = getViewSite().getActionBars()
66                .getToolBarManager();
67    }

68
69    /**
70     * Initialize the menu
71     */

72    private void initializeMenu() {
73        IMenuManager menuManager = getViewSite().getActionBars()
74                .getMenuManager();
75    }

76
77    @Override
78    public void setFocus() {
79        // Set the focus
80    }

81
82    }


其中,添加控件的代码由Disgner插件自动生成。这个时候,如果我们运行程序的话,我们的视图还不会被显示出来。为了让我们的视图可以显示,我们还需要修改Perspective.java文件,代码如下:

 1 package cn.blogjava.youxia.rcp_start ;
 2
 3 import org.eclipse.ui.IPageLayout ;
 4 import org.eclipse.ui.IPerspectiveFactory ;
 5
 6 public class Perspective implements IPerspectiveFactory {
 7
 8     public void createInitialLayout(IPageLayout layout) {
 9         String editorArea = layout.getEditorArea() ;
10         layout.addView("cn.blogjava.youxia.views.FirstView", IPageLayout.RIGHT, 0.2f, editorArea) ;
11     }
12 }

运行程序,得到如下效果:

rcp23.JPG

我们可以发现,上面这个视图的标签不是我们通常看到的波浪形,我们可以通过配置文件的方式来更改产品的样式。
首先,在plugin.xml中对org.eclipse.core.runtime.products扩展点的属性进行更改,如下:

 1 <extension
 2          id="product"
 3          point="org.eclipse.core.runtime.products">
 4       <product
 5             application="cn.blogjava.youxia.rcp_start.application"
 6             name="第一个RCP程序">
 7          <property
 8                name="preferenceCustomization"
 9                value="plugin_customization.ini"/>
10       </product>
11 </extension>

可见,我们为我们的产品添加了一个prefereneCustomization属性,该属性的值为plugin_customization.ini文件,在该文件中,我们可以配置我们的样式。在这里,它的内容如下:
1 org.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false
2 org.eclipse.ui/DOCK_PERSPECTIVE_BAR=topRight

事实上,在这个文件中可以定义的参数有上百个,大家可以查看Eclipse的文档。
这个时候,效果应该是这样的了:
rcp24.JPG

好了,我们现在对以上的代码做一个总结。我不是写教科书,在Blog中也没有写得那么详细的条件。我们这里主要关注在哪个地方对代码进行扩展,可以达到我们想要的效果。比如,我们要创建视图,就是需要扩展org.eclipse.ui.part.ViewPart类,然后向其中添加控件,再然后配置plugin.xml文件,最后修改透视图的代码,以便它能够显示出来。

在ViewPart类中,我们添加控件的操作主要是在public void createPartControl(Composite parent)这个方法中进行,而方法最后会调用以下三个方法:
createActions();
initializeToolBar();
initializeMenu();
从这三个方法的方法名我们不难看出,它们的功能是创建视图特有的菜单栏和工具栏的,结合上一小节的内容,我们应该很快就可以探索到怎么给视图添加漂亮的工具栏了,这里我不再罗嗦。

再来看Perspective.java,不难发现,所有的透视图类都需要实现IPerspectiveFactory接口,而该接口的createInitialLayout方法,就是描述工作台窗口中编辑器和视图的布局。默认情况下,透视图中只包含一个编辑器区域,就是我们第一节中看到的那个效果。在createInitialLayou中,我们可以通过以下几个方法向透视图中添加视图、编辑器和菜单:
addView   —— 添加视图
addActionSet —— 添加菜单和工具栏
createFolder —— 创建一个IForderLayou,可以让多个视图重叠在同一个位置

写到这里,肯定有人会问,如果我要创建一个象Eclipse中的资源视图这样的视图,该怎么做呢?这我们就要感谢org.eclipse.jface.viewers包了,Viewer,这里翻译为查看器,它和视图是不一样的。JFace查看器是Jface对SWT部件的封装,它简化了我们对小部件的操作。在使用查看器的时候,它的数据使用单独的模型对象来保存,使用查看器的setInput方法可以为查看器设置模型,此外,在使用查看器的时候,需要为它提供ContentProvider(内容提供器)和LabelProvider(标签提供器)。

JFace查看器主要分为以下几类:
1. ListViewer: 对应于SWT的列表控件,目的是将列表中的元素映射至SWT列表控件
2. TreeViewer: 对应于SWT的树控件,提供树的展开和折叠等基本操作
3. TableViewer: 对应于SWT的表控件,映射表中的元素
4. TextViewer: 对应于SWT的StyledText控件,创建编辑器的时候,使用这个查看器是最合适不过了。

好了,介绍性的文字就写到这里,我想大家一定已经知道了探索的方向。下面,我们看一个简单的示例,就是这篇文章开头给出的效果图。它是我模仿医院管理系统做的一个简单例子,左边的视图就是使用了一个ListView查看器。这里给出它的关键代码:
 1 public  void createPartControl(Composite parent)  {
 2        
 3
 4        viewer = new ListViewer(parent, SWT.BORDER);
 5        viewer.setContentProvider(new PersonContentProvider());
 6        viewer.setLabelProvider(new PersonLabelProvider());
 7        viewer.setInput(new PersonModel());
 8        
 9        createActions();
10        initializeToolBar();
11        initializeMenu();
12    }

可以看到,这里需要设置内容提供器和标签提供器和模型。下面,我们先创建一个病人类Person.java:
 1 package cn.blogjava.youxia.views;
 2
 3 public  class Person  {
 4    
 5    private String name;
 6    private String sex;
 7    public String getName() {
 8        return name;
 9    }

10    public void setName(String name) {
11        this.name = name;
12    }

13    public String getSex() {
14        return sex;
15    }

16    public void setSex(String sex) {
17        this.sex = sex;
18    }

19
20}

下面,创建模型类PersonModel.java,在构造函数中我们向List中填入了几个初始化数据:
 1 package cn.blogjava.youxia.views;
 2 import java.util.ArrayList;
 3
 4 public  class PersonModel  {
 5    
 6    private ArrayList<Person> list = new ArrayList<Person>();
 7    
 8    public interface Listener{
 9        public void add(Person p);
10        public void remove(Person p);
11    }

12    
13    private Listener listener;
14    
15    public PersonModel(){
16        //向list里面填入几个初始化数据
17        Person p1 = new Person();
18        p1.setName("病人1");
19        p1.setSex("男");
20        list.add(p1);
21        
22        Person p2 = new Person();
23        p2.setName("病人2");
24        p2.setSex("女");
25        list.add(p2);
26        
27    }

28
29    public void setListener(Listener listener){
30        this.listener = listener;
31    }

32    
33    public void add(Person p){
34        list.add(p);
35        if(listener != null){
36            listener.add(p);
37        }

38    }

39    
40    public void remove(Person p){
41        list.remove(p);
42        if(listener != null){
43            listener.remove(p);
44        }

45    }

46    
47    public ArrayList elements(){
48        return list;
49    }

50}

在这里,我们还定义了一个Listener接口,为什么要有这么一个接口呢?就是为了让我们模型中的数据被改变时,查看器能够相应更改。下面,我们实现内容提供器,该内容提供器实现了PersonModel中定义的Listener接口,如下PersonContentProvider.java:
 1 package cn.blogjava.youxia.views;
 2
 3 import org.eclipse.jface.viewers.IStructuredContentProvider;
 4 import org.eclipse.jface.viewers.Viewer;
 5 import org.eclipse.jface.viewers.ListViewer;
 6
 7 import cn.blogjava.youxia.views.PersonModel.Listener;
 8
 9 public  class PersonContentProvider  implements IStructuredContentProvider,
10         Listener  {
11
12    PersonModel input;
13    ListViewer viewer;
14    
15    public Object[] getElements(Object inputElement) {
16        // TODO 自动生成方法存根
17        return input.elements().toArray();
18    }

19
20    public void dispose() {
21        // TODO 自动生成方法存根
22        if(input != null){
23            input.setListener(null);
24        }

25        input = null;
26
27    }

28
29    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
30        // TODO 自动生成方法存根
31        viewer = (ListViewer)viewer;
32        input = (PersonModel)newInput;
33        input.setListener(this);
34
35    }

36
37    public void add(Person p) {
38        // TODO 自动生成方法存根
39        viewer.add(p);
40    }

41
42    public void remove(Person p) {
43        // TODO 自动生成方法存根
44        viewer.remove(p);
45    }

46
47}

我们知道,列表中的元素都是Person类的对象,怎么让他们显示出来呢,需要实现标签提供器,在标签提供器中,我们可以设置对象显示的图标和文字,如下PersonLabelProvider.java:
 1 package cn.blogjava.youxia.views;
 2
 3 import org.eclipse.jface.viewers.ILabelProvider;
 4 import org.eclipse.jface.viewers.ILabelProviderListener;
 5 import org.eclipse.swt.graphics.Image;
 6
 7 public  class PersonLabelProvider  implements ILabelProvider  {
 8
 9    public Image getImage(Object element) {
10        return null;
11    }

12
13    public String getText(Object element) {
14        // TODO 自动生成方法存根
15        return ((Person)element).getName();
16    }

17
18    public void addListener(ILabelProviderListener listener) {
19        // TODO 自动生成方法存根
20
21    }

22
23    public void dispose() {
24        // TODO 自动生成方法存根
25
26    }

27
28    public boolean isLabelProperty(Object element, String property) {
29        // TODO 自动生成方法存根
30        return false;
31    }

32
33    public void removeListener(ILabelProviderListener listener) {
34        // TODO 自动生成方法存根
35
36    }

37
38}

运行程序,就得到了文章开头的效果,但是不能在右边的视图中显示病人的详细信息。

如果要做到视图的交互,需要添加事件的监听器。使用Java 进行GUI开发的人应该都不会陌生,而我在RCP上,也处于探索阶段,更深一步的内容,让我们自己慢慢研究吧。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liushuo_whu/article/details/40867645

智能推荐

mysql 匿名函数调用_Go语言闭包(Closure)——引用了外部变量的匿名函数-程序员宅基地

文章浏览阅读67次。Go语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说:函数 + 引用环境 = 闭包同一个函数与不同引用环境组合,可以形成不同的实例,如下图所示。图:闭包与函数引用一个函数类型就像结构体一样,可以被实例化,函数本身不存储任何信息,只有与引用环境结合后形成的闭包才具有“记忆性”,函数是编...

ios13文件连接服务器端口,【Tips】iOS13/iPadOS 与 Windows 无缝互传文件-程序员宅基地

文章浏览阅读1.4k次。1开始前的准备一台运行 iOS13.0 以上系统或 iPadOS 的Apple设备。一台运行 Windows 系统的 PC。Windows 系统中登录了自己的微软账号。Apple 设备与 PC 处于同一无线局域网。2效果演示3让我们开始吧1、在电脑任意位置新建文件夹,然后右键文件夹选择“属性”,点击最顶上第二个“共享”,然后点击“高级共享“,勾选“共享此文件夹”。2、点击下面的“权限”,然后全部勾...

CSS里取消hover效果,CSS3实现动态删除线式hover效果-程序员宅基地

文章浏览阅读5.3k次。CSS语言:CSSSCSS确定@import url(https://fonts.googleapis.com/css?family=Roboto+Condensed:400,300);body {display: table;width: 100%;height: 100vh;margin: 0;background: #333;font-family: 'Roboto Condensed', ..._css 移除hover

115网盘资源下载到群晖_tailscale下载-程序员宅基地

文章浏览阅读1.7w次,点赞2次,收藏27次。简单说明:本方案不是用来提速的,只是方便将 115 网盘的资源下载到群晖可以将 115 网盘的资源下载到任何地方,只是因为群晖是 7*24 小时开机的,所以更方便而已也可以将 Aria2 作为通用的下载器,而不仅局限于下载 115 网盘的资源安装 Aria2什么是 Aria2 ?aria2 是一个轻量级的多协议和多源命令行下载实用程序。它支持 HTTP/HTTPS、FTP、SFTP、 BitTorrent 和 Metalink 。aria2 可以最大程度利用你的网络带宽,你可._tailscale下载

车辆工程计算机语言,车辆工程毕业设计(文)-基于C语言的BP神经网络预测程序开发【全套设计】.doc...-程序员宅基地

文章浏览阅读150次。车辆工程毕业设计(文)-基于C语言的BP神经网络预测程序开发【全套设计】本科学生毕业设计系部名称:专业班级:学生姓名:指导教师:职 称:The Graduation Design for Bachelor's DegreeDevelopment on BP eural Network Prediction Program Based on C LanguageCandidate:Gao Xi..._车辆工程需要学的计算机语言

kepserver写入mysql_Kepserver连接Mysql教程(三)Kepserver 数据写入mysql数据库-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏13次。在上篇教程:OPC服务器软件Kepware Kepserver实现与Mysql数据库连接交互(一)中我们学习了MySQL数据库简介、OPC服务器软件Kepserver软件介绍、MySQL5.5数据库安装配置等内容。在OPC服务器软件Kepware Kepserver实现与Mysql数据库连接交互(二)Kepserver软件安装配置中我们学习了Kepserver软件安装配置等内容。目录五、MySQ..._kepserver写不进去值

随便推点

基于Win64的Masm64函数设计-程序员宅基地

文章浏览阅读379次。介绍基于Win64的Masm64函数设计模型。在Win64的API中,函数调用方法非常灵活,所以用户自己编写的函数也应该符合这种要求,特别是编写库函数,如果不符要求,则会给使用者带来很多麻烦。为了减少编程中的错误,这里介绍五种函数形式。_masm64

计算机网络(1.10)概述- TCP/IP 的体系结构_tcp/ip体系结构有什么突出的特点?试解释everything over ip 和ip over -程序员宅基地

文章浏览阅读514次。实际上,现在的互联网使用的TCP/IP 体系结构有时 已经发生了演变,即某些应用程序可以直接使用 IP 层,或甚至直接使用最下面的网络接口层。【例1-2】客户进程和服务器进程 使用TCP/IP 协议栈进行通..._tcp/ip体系结构有什么突出的特点?试解释everything over ip 和ip over everthing 的含义。

安装好oracle之后在相应路径下却没有生成tnsnames.ora和listener.ora_oracle没有listener.ora-程序员宅基地

文章浏览阅读3.4w次,点赞12次,收藏56次。可以看到我的admin下是没有tnsnames.ora和listener.ora这两个文件的且我的数据库只有自带的tnsnames.ora和listener.ora接下来需要做的操作第一步 找到你的路径,例如我的是:C:\app\Administrator\product\11.2.0\dbhome_1\admin第二步 在系统变量里添_oracle没有listener.ora

Python中import导入上一级目录模块及循环import问题的解决_python 无法import上一级目录里python里的函数-程序员宅基地

文章浏览阅读6.2k次,点赞3次,收藏3次。import上一级目录的模块python中,import module会去sys.path搜索,sys.path是个列表,并且我们可以动态修改。要import某个目录的module,我们sys.path.insert(0,somedir)来加入搜索路径,就可以import了。既然这样,要import上一级目录的module,可以sys.path.insert(0,parentdir)。不过..._python 无法import上一级目录里python里的函数

Android开发之线程&线程池姿势总结_构建一个有looper的线程池-程序员宅基地

文章浏览阅读251次。Android 中的主线程和子线程主线程(UI线程)主要用来处理四大组件间的交互,子线程用来做耗时操作(网络请求,I/O操作,sqlite操作等)由于主线程比较特殊,因为本身主线程在处理界面上,用了大部分的消耗,所以主线程不能再处理过于耗时的操作(IO操作,网络请求,大量的数据操作),否则就会造成ANR现象(程序卡死)。Activity响应时间超过5sBroadcast在处理时间超过10..._构建一个有looper的线程池

Windows server 2016 安装sql server_windows2016sql数据库安装-程序员宅基地

文章浏览阅读4.3k次。Windows server 2016 安装sql server 企业版1、 首先,要挂上sql server的镜像2、 选择安装,单机第一项3、 输入产品密钥,可以直接下一步4、 接受霸王条款5、 实验环境下不需要使用Microsoft Update检车更新,所以直接下一步。6、 实验环境不需要产品更新,直接下一步7、 安装规则这边只要不出现失败,警告则可以忽略8、 功能可以保持默认或者安装(一些功能用不到,右边有功能说明).需要打钩的(数据库引擎服务、sqlserver复制、全文_windows2016sql数据库安装