`
visionary_2006
  • 浏览: 126167 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

RCP应用程序开发之四——应用程序窗体生成过程

    博客分类:
  • RCP
阅读更多
在eclipse平台下,导入一个应用程序模板后,可以直接运行。这篇文章主要将窗体在生成的过程中有哪些重要的步骤总结了一下。
本篇文章分为那两个部分:
第一个部分为rcp应用程序生成窗体经历的几个步骤。
第二个部分描述窗上尚菜单、工具栏的生成。
1.1        rcp应用程序生成窗体经历的几个步骤:
生成应用程序的窗体,主要经历了以下几个步骤:
1、在application中:创建了工作台
int returnCode = PlatformUI.createAndRunWorkbench(display,
new ApplicationWorkbenchAdvisor());
2、在ApplicationWorkbenchAdvisor中:配置应用程序的窗体
public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
           IWorkbenchWindowConfigurer configurer) {
       return new ApplicationWorkbenchWindowAdvisor(configurer);
   }
3、在ApplicationWorkbenchWindowAdvisor类中:配置菜单栏工具栏
public ActionBarAdvisor createActionBarAdvisor(
           IActionBarConfigurer configurer) {
       if (fActionBuilder == null)
       fActionBuilder = new WorkbenchActionBuilder(configurer);
       return fActionBuilder.makeWinAction();
   }
4、在WorkbenchActionBuilder类中:返回不同工作台窗体的ActionBarAdvisor
   public WorkbenchActionBuilder(IActionBarConfigurer Ibarconfigurer) {
       this.Ibarconfigurer = Ibarconfigurer;
   }
      
   public ActionBarAdvisor makeWinAction(){
       switch(WorkbenchControler.flag){
       case WorkbenchControler.main:
           actionBarAdvisor = new MainActionBarAdvisor(Ibarconfigurer);
           break;
       case WorkbenchControler.child_1:
           actionBarAdvisor = new Child_1_ActionBarAdvisor(Ibarconfigurer);
           break;
       case WorkbenchControler.child_2:
           actionBarAdvisor = new MainActionBarAdvisor(Ibarconfigurer);
           break;
       }
       return actionBarAdvisor;
   }
   …
那么eclipse是怎样来帮助我们生成一个主窗体的呢?在这个过程中又经历了哪些过程?现在详细的学习这个过程。
(1)PlatformUI的方法createAndRunWorkbench(),这个方法用来创建工作台。
在(1)中,调用的是PlatformUI的这个方法:
public static int createAndRunWorkbench(Display display,
            WorkbenchAdvisor advisor) {
        return Workbench.createAndRunWorkbench(display, advisor);
    }
通过createAndRunWorkbench来创建工作台窗体,在这个方法中,调用了Workbench了的createAndRunWorkbench这个方法。
(2) Workbench的createAndRunWorkbench()方法
public static final int createAndRunWorkbench(Display display,
           WorkbenchAdvisor advisor) {
       // create the workbench instance
       Workbench workbench = new Workbench(display, advisor);
       // run the workbench event loop
       int returnCode = workbench.runUI();
       return returnCode;
   }
在这个方法中,创建了一个工作台的实例,并把adivsor作为参数传入。然后运行一个Workbench中的一个runUI方法,主要通过这个方法创建了工作台的窗体。我们看看这个方法都实现了什么。
(3)Workbench的runUI()方法
我们看下面这行代码,int returnCode = workbench.runUI();
runUI()的功能就是:用来运行workbench UI(工作台窗体),直到工作台(workbench)关闭和重新启动,它用来承担处理和分派事件。(Internal method for running the workbench UI. This entails processing and dispatching events until the workbench is closed or restarted.)
当正常退出时,返回RETURN_OK,当工作台通过一个针对IWorkbench.restart的访问终止时,返回RETURN_RESTART 当工作台不能被启动时返回RETURN_UNSTARTABLE。其他值留为后用。
在这个runUI()方法中,我们看到一个比较重要的方法:
(4)runUI()方法中的init(display)方法
boolean initOK = init(display);这个方法属于Workbench的内部方法,用来初始化工作台,重建或打开一个窗体。如果init成功,返回initOK。在这个方法中,创建了针对窗体的管理WindowManager,命令的管理CommandManager,上下文的管理ContextManager.
另外在这个方法中还初始化了图像,颜色等。
initializeImages();
initializeFonts();
initializeColors();
initializeApplicationColors();
{通过这些方法,可以学习eclipse是怎么初始化Image,Font,Color等这些比较耗费资源的例子,针对这方面的学习,以后再续。}
在init中,还有个比较重要的方法:通过advisor引用internalBasicInitialize方法:
advisor.internalBasicInitialize(getWorkbenchConfigurer());
我们首先看看它的参数:一个WorkbenchConfiguer对象,getWorkbenchConfigurer()方法在WorkbenchConfiguer类中定义,它返回一个单例WorkbenchConfiguer对象。这个对象用来配置工作台。
public final void internalBasicInitialize(IWorkbenchConfigurer configurer) {
        if (workbenchConfigurer != null) {
            throw new IllegalStateException();
        }
        this.workbenchConfigurer = configurer;
        initialize(configurer);
    }
在internalBasicInitialize将configure对象引用传递给WorkbenchAdvisor对象的workbenchConfigurer属性,并调用了WorkbenchAdvisor类的initialize方法。这个很重要。我们在有关工作台(Workbench)生命周期的文章中提到:initialize方法是在任何窗体打开前调用这个方法。可以用来初始化。我们可以在WorkbenchAdvisor的子类中来实现这个方法。
我们来看看这个方法的官方译文:
在工作台启动之前,执行任意的初始化内容。
在任何窗体被打开之前,工作台初始化时,这个方法会被优先的访问。用户不能直接访问这个方法,,缺省的没有任何的实现。子类可以继承这个方法。用户会用configuer来配置工作台,如果需要用,则用户需要获得通过getWorkbenchConfigurer来获得configurer。
[Performs arbitrary initialization before the workbench starts running.
This method is called during workbench initialization prior to any windows being opened. Clients must not call this method directly (although super calls are okay). The default implementation does nothing. Subclasses may override. Typical clients will use the configurer passed in to tweak the workbench. If further tweaking is required in the future, the configurer may be obtained using getWorkbenchConfigurer. ]
(5)preStartup()方法
在init()这个方法中,还调用了:
advisor.preStartup();
具体的可以参考:前面讲到WorkbenchAdvisor的生命周期中的preStartup方法,它的调用是在第一个窗口打开之前。在启动或者恢复期间暂时禁用某些项时,该方法非常有用。
这个方法在第一个工作台窗体被打开或恢复(重建)时,执行任意的操作。
这个的实在workbench被初始化的之后被访问的,用户不能直接访问这个方法,必须通过子类继承。
[Performs arbitrary actions just before the first workbench window is opened (or restored).
This method is called after the workbench has been initialized and just before the first window is about to be opened. Clients must not call this method directly (although super calls are okay). The default implementation does nothing. Subclasses may override.]
然后再执行下面这个if语句:
if (!advisor.openWindows()) {
               return false;
           }
(6)WorkbenchAdvisor的openWindows()方法
我们看看WorkbenchAdvisor的openWindows()是怎么实现的:
public boolean openWindows() {
        IStatus status = getWorkbenchConfigurer().restoreState();
        if (!status.isOK()) {
            if (status.getCode() == IWorkbenchConfigurer.RESTORE_CODE_EXIT) {
                return false;
            }
            if (status.getCode() == IWorkbenchConfigurer.RESTORE_CODE_RESET) {
                getWorkbenchConfigurer().openFirstTimeWindow();
            }
        }
        return true;
    }
OpenWindows方法的翻译:这个方法用来在在启动时打开工作台窗体。缺省的实现是:通过IWorkbenchConfigurer.restoreWorkbenchState()方法,试图重建(或恢复)先前已保存的工作台状态。如果没有任何先前已保存的状态,或者是重建(恢复)失败,则通过IWorkbenchConfigurer.openFirstTimeWindow来打开第一个窗体。
(Opens the workbench windows on startup. The default implementation tries to restore the previously saved workbench state using IWorkbenchConfigurer.restoreWorkbenchState(). If there was no previously saved state, or if the restore failed, then a first-time window is opened using IWorkbenchConfigurer.openFirstTimeWindow. )
(7)getWorkbenchConfigurer().openFirstTimeWindow()
下面,我们来看看getWorkbenchConfigurer().openFirstTimeWindow()是什么?
getWorkbenchConfigurer()返回一个workbench配置(congifuger)
我们在看看openFirstTimeWindow()方法:它是IWorkbenchConfigurer接口中定义的方法,并由WorkbenchConfigurer实现,实现的方式如下:调用了Workbench的openFirstTimeWindow的方法。
((Workbench) getWorkbench()).openFirstTimeWindow();
我们打开openFirstTimeWindow()方法:
在这个方法中,它又调用了一个doOpenFirstTimeWindow()方法,而这个方法调用了busyOpenWorkbenchWindow方法,这个方法也是Workbench的一个内部方法。它的参数是一个特殊的透视图(Perspective)和一个缺省的workbench page。我们看看他的方法体:
private IWorkbenchWindow busyOpenWorkbenchWindow(String perspID,
           IAdaptable input) throws WorkbenchException {
       // Create a workbench window (becomes active window)
       WorkbenchWindow newWindow = newWorkbenchWindow();
       newWindow.create(); // must be created before adding to window manager
       windowManager.add(newWindow);
       // Create the initial page.
       if (perspID != null) {
           try {
               newWindow.busyOpenPage(perspID, input);
           } catch (WorkbenchException e) {
               windowManager.remove(newWindow);
               throw e;
           }
       }
       // Open window after opening page, to avoid flicker.
       newWindow.open();
       return newWindow;
   }
在这个方法中,用一个newWorkbenchWindow()创建了一个工作台窗体。new了一个WorkbenchWindow对象。
(8)WorkbenchWindow的构造方法。
public WorkbenchWindow(int number) {
        super(null);
        this.number = number;
        // Make sure there is a workbench. This call will throw
        // an exception if workbench not created yet.
        PlatformUI.getWorkbench();
        // Add contribution managers that are exposed to other plugins.
        addMenuBar();
        addCoolBar(SWT.FLAT);
        addStatusLine();
        actionPresentation = new ActionPresentation(this);
        // register with the tracker
        getExtensionTracker()
                .registerHandler(
                        actionSetHandler,
                        ExtensionTracker
                                .createExtensionPointFilter(getActionSetExtensionPoint()));
        fireWindowOpening();
        // set the shell style
        setShellStyle(getWindowConfigurer().getShellStyle());
        // Fill the action bars
        fillActionBars(FILL_ALL_ACTION_BARS);
    }
在这个构造方法中,用addMenuBar()、addCoolBar(SWT.FLAT)、addStatusLine()定义的工作台的菜单,工具
分享到:
评论

相关推荐

    mysql安装教程,mac,windows

    1、Mac 2、windows 3、下载MySQL 4、安装MySQL 5、使用MySQL

    生成可读取配置文件的独立运行jar程序IDEA模版工程

    周五刚躺下,前线打来语音要个下载文件的小程序,下载路径和下载码需要根据配置获取,程序需要在服务器执行。当然配置的设计是个人设计的,不然每次更新下载码都要重新出具jar包,太麻烦。多年没写独立运行的jar包了,翻阅了相关资料,最终还是功夫不负有心人。想着这种需求后续可能经常碰到,遂总结经验,整理成模版,为大家所用。 ————————————————————————————————— 原文链接:https://blog.csdn.net/xuanxiaochuan/article/details/137001184 根据文章创建的模版工程文件,下载后可直接编辑main方法,根据自己的需求自定义逻辑内容,编译后获取independent.jar文件,修改配置文件后,通过java -jar independent.jar 执行命令,正常执行。

    世界读书日ppt模板x.pptx

    世界读书日ppt模板x.pptx

    Week+5.ipynb

    Week+5.ipynb

    L型单极性单相逆变电路simulink仿真

    单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆变电路simulink仿真单极性单相逆

    pypy3.7-v7.3.8-aarch64-portable.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    xx集团数字化转型方案ss.pptx

    xx集团数字化转型方案ss.pptx

    chatgpt免费使用.txt

    chatgpt免费使用

    超微 X11DPX-T主板用户手册

    超微 X11DPX-T主板用户手册

    tensorflow-2.6.2-cp36-cp36m-manylinux2010-x86-64.whl

    numpy安装

    pypy2.7-v7.2.0rc0-aarch64.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pypy2.7-v7.3.12rc2-s390x.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ddwrt.v24-vpn-generic.bin

    ddwrt.v24_vpn_generic.bin

    pypy3.7-v7.3.4-osx64.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    《工业视觉检测平台的思考与应用》qy.pptx

    《工业视觉检测平台的思考与应用》qy.pptx

    输电线路涉鸟故障相关鸟种细粒度分类数据集(2889张+50类)

    内含输电线路涉鸟故障相关鸟种细粒度分类数据集,2889张图片,图像分类数据集,类别有50,可以用于电气工程专业在计算机视觉应用领域做研究,例如目标检测、图像识别、深度学习等!!! txt文件内有下载链接和提取码,放心下载即可!!!!

    毕业设计: Java项目springboot基于SpringBoot的医院药品管理系统(源码 + 数据库 + 论文)

    论文目录: 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3.1.3 经济可行性 5 3.1.4 法律可行性 5 3.2 系统性能分析 5 3.3 系统功能分析 6 3.3.1 角色需求 6 3.3.2 功能需求 6 3.4 系统流程分析 6 3.4.1 注册流程 6 3.4.2 登录流程 7 4 系统设计 8 4.1 系统概要设计 8 4.2 系统结构设计 8 4.3 数据库设计 9 4.3.1 数据库表设计 9 5 系统的实现 13 5.1 功能模块的实现 13 5.1用户信息管理 13 5.2 员工信息管理 14 5.3药品信息管理 16 5.1公告信息管理 18 6 系统测试 21 6.1 测试定义 21 6.2 测试目的 21 6.3 测试方法 21 6.4 测试分析 21

    OpenLane车道线数据集百度网盘链接(永久有效)

    总大小:114.39G OpenLane包含20万帧、超过88万条实例级车道、14个车道类别(单白色虚线、双黄色实体、左/右路边等),以及场景标签和路线邻近目标(CIPO)注释,以鼓励开发3D车道检测和更多与产业相关的自动驾驶方法。

    pypy2.7-v7.2.0-s390x.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ASCII码表 ASCII码表

    ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表 ASCII码表

Global site tag (gtag.js) - Google Analytics