`
sunway
  • 浏览: 115137 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第二章 主类和主界面类的实现(1)

阅读更多
From:http://www.blog.edu.cn/user1/19180/archives/2005/372845.shtml
1 插件主类

所谓的插件主类,就等同于一般Java程序中的main函数。它实现了如何启动、停止插件等动作。这个类实际上就是一个实现了org.eclipse.ui.plugin.AbstractUIPlugin的类,这个类的代码比较简单,利用向导生成的默认代码就可以了。如果你删除了默认的文件,下面的示例可以帮助你编写新的类:

java 代码
package pku.oo.notationBuilder;

import org.eclipse.ui.plugin.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.osgi.framework.BundleContext;

public class NotationBuilderPlugin extends AbstractUIPlugin {

//The shared instance.
private static NotationBuilderPlugin plugin;

/**
* The constructor.
*/
public NotationBuilderPlugin() {
plugin = this;
}

/**
* This method is called upon plug-in activation
*/
public void start(BundleContext context) throws Exception {
super.start(context);
}

/**
* This method is called when the plug-in is stopped
*/
public void stop(BundleContext context) throws Exception {
super.stop(context);
plugin = null;
}

/**
* Returns the shared instance.
*/
public static NotationBuilderPlugin getDefault() {
return plugin;
}

/**
* Returns an image descriptor for the image file at the given
* plug-in relative path.
*
* @param path the path
* @return the image descriptor
*/
public static ImageDescriptor getImageDescriptor(String path) {
return AbstractUIPlugin.imageDescriptorFromPlugin("NotationBuilder", path);
}
}



注释已经很清晰了,大部分代码只要拷贝就可以了。

2 编写插件界面主类

插件界面主类实现了如何创建插件的主界面,但是一个GEF编辑器插件的主界面到底是什么呢?我下面先详细介绍一下。

一个GEF编辑器插件的主界面一般包括三个部分:Palette,调色板,就好像是eclipse中WindowsBuilder Pro中的控件工具栏;Outline Page,大纲页,好像是eclipse的Package Explorer;主编辑区域,顾名思义了。

当然,一个GEF编辑器插件并非一个需要这三个,对于Palette和Outline Page是可选的,而我们将要创建的界面主类,则是用来创建主编辑区域的,因此它是必选的。在后面的分析中我们会看到,Outline Page和主编辑区域的工作原理十分相似,地位上他们是平等的(这就是说,他们都是一种编辑区域,都可以对我们的文件内容进行编辑),这与Palette不同。

如果要编写一个支持Palette的界面主类,我们需要一个继承自GraphicalEditorWithPalette的类。同时我们应该实现或覆盖下面的函数或接口:
protected void configureGraphicalViewer();
这个函数告诉eclipse如何配置编辑器的主界面,在这个函数里我们应该编写创建主界面的代码,并设置EditPart的工厂,关于EditPart的概念,稍后详述,而EditPart的工厂类,主要作用是根据模型创建EditPart,这其中牵扯到GEF的框架以及各个部分的创建顺序(先创建模型,再创建EditPart、最后创建Figure,这些概念都在后面叙述)。
protected PaletteRoot getPaletteRoot();
这个接口用来创建调色板。调色板的结构实际就是一个颗树,这里用来获得树根。
protected void initializeGraphicalViewer();
这个接口用于为编辑器创建context,实际就是编辑器的模型部分。然后eclipse会根据这个模型创建编辑器的EditPart,创建的原则由EditPart的工厂给出。这些概念都在以后说明。
public void doSave(IProgressMonitor monitor);
public void doSaveAs();
这两个接口都是顾名思义,不做过多解释。只是这个参数的作用还没有搞明白。
public boolean isDirty();
这个函数用于返回命令栈是不是“脏的”(虽然我不太喜欢这么翻译)。
public Object getAdapter(Class type);
这个函数用于获得指定类型的适配器类,一般重载这个函数创建自己的Outline Page。这个函数可以用来创建很多其它的东西,比如Property Sheet,你可以参考其父类的实现。
protected void initializePaletteViewer();
这个函数用来初始化Palette,如果你需要给Palette增加什么新的功能,可以重载这个函数,一般情况下使用默认的就可以了。

下面的示例代码能够帮助你了解如何编写这个类,你只需要注意函数的功能,至于中间的一些代码、出现的类我会在稍后说明:

java 代码
package pku.oo.ui;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
import org.eclipse.gef.ui.parts.GraphicalEditorWithPalette;
import org.eclipse.gef.ui.parts.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;

import pku.oo.model.Diagram;
import pku.oo.part.PartFactory;
import pku.oo.part.TreePartFactory;
import pku.oo.util.PaletteFactory;

public class NotationBuilderEditor extends GraphicalEditorWithPalette {

private Diagram diagram = new Diagram();

public NotationBuilderEditor() {
super();
this.setEditDomain(new DefaultEditDomain(this));
}
public Diagram getDiagram() {
return this.diagram;
}

protected void configureGraphicalViewer() {
super.configureGraphicalViewer();
getGraphicalViewer().setRootEditPart(new ScalableFreeformRootEditPart());
getGraphicalViewer().setEditPartFactory(new PartFactory());
}
private PaletteRoot paletteRoot;

protected PaletteRoot getPaletteRoot() {
if (this.paletteRoot == null) {
this.paletteRoot = PaletteFactory.createPalette();
}
return this.paletteRoot;
}

protected void initializeGraphicalViewer() {
getGraphicalViewer().setContents(this.diagram);
}

public void doSave(IProgressMonitor monitor) {
}

public boolean isDirty() {
return getCommandStack().isDirty();
}

public void doSaveAs() {
}
public Object getAdapter(Class type) {
if (type == IContentOutlinePage.class)
return new OutlinePage();
return super.getAdapter(type);
}

public boolean isSaveAsAllowed() {
return false;
}


class OutlinePage extends ContentOutlinePage {
public OutlinePage() {
super(new TreeViewer());
}

public void init(IPageSite pageSite) {
super.init(pageSite);
}

public void createControl(Composite parent) {
super.createControl(parent);
getSelectionSynchronizer().addViewer(getViewer());
getViewer().setEditDomain(getEditDomain());
getViewer().setEditPartFactory(new TreePartFactory());
getViewer().setContents(getDiagram());
}

public void dispose() {
getSelectionSynchronizer().removeViewer(getViewer());
super.dispose();
}
}

}

 

分享到:
评论

相关推荐

    Kotlin 1.3 案例集锦第三章 通讯录主类初始化

    Kotlin 1.3 案例集锦第三章 通讯录主类初始化

    Kotlin 1.3 案例集锦第三章 通讯录主类搜索及数据

    Kotlin 1.3 案例集锦第三章 通讯录主类搜索及数据处理

    JAVA课程设计(做界面)

    本程序选择了JTextField、JRadioButton、JComboBox、JButton等组件来实现界面。JTextField用于输入文本信息,JRadioButton用于选择性别,JComboBox用于选择省份、城市、年级,JButton用于添加学生信息。 知识点六:...

    Visual C++界面编程技术代码(1--7章)随书光盘

    《Visual C++界面编程技术代码(1--7章)随书光盘》是针对学习Visual C++界面编程的读者提供的一份宝贵资源。这个压缩包包含的文件分别对应书籍的前七章,按照章节顺序命名,分别是chap1到chap7。下面我们将详细探讨...

    微信分享 不修改主类

    在这个特定的场景中,“微信分享 不修改主类”意味着开发者可能找到了一种方法来实现微信分享功能,而无需对应用程序的主Activity进行任何修改。这通常涉及到对第三方库的集成和对现有代码结构的理解。 首先,我们...

    javafx实现好看的界面

    - 主类:启动应用程序的Java类,通常包含`start()`方法来加载和显示Scene。 通过研究这个压缩包中的内容,开发者可以深入理解JavaFX的工作原理,学习如何利用其特性创建出具有专业外观和用户体验的应用程序。无论是...

    界面设计源代码

    "TestDemo.java"可能是主程序文件,通常包含主类和主方法,它是程序的入口点,通过`public static void main(String[] args)`函数启动。这个文件可能包含了Swing的一些基本组件和布局管理器,如JFrame(窗口)、...

    VC界面类编程\源代码\用c++做的qq界面

    1. **窗口类和消息处理**:每个窗口都是CWnd的派生类实例,它们需要重载OnCreate、OnPaint等消息处理函数,以实现窗口的初始化和绘制。 2. **控件的创建和布局**:在界面设计中,需要创建各种控件如按钮、文本框,...

    简述Java程序的构成如何判断主类.doc

    Java Application 程序的主类是包含 main() 方法的类,Java Applet 程序的主类是系统类 Applet 的派生子类。主类的类名就是这个 Java 源程序的文件名。 判断主类的方法是查看该类是否包含 main() 方法。如果该类...

    java实现了系统托盘的主类

    实现了java的系统托盘等等之类的。要看的可以see see 额

    在CMD下用java命令出现“找不到或无法加载主类”问题

    当在命令行界面(如Windows的CMD)执行`java`命令时,如果出现“找不到或无法加载主类”的错误提示,通常意味着Java运行时环境(JRE)无法找到并加载指定的主类。这可能是由以下几个原因造成的: 1. **类路径设置不...

    简单JAVA语言编写的万年历系统源码(图形界面)

    首先,源码中可能会包含一个主类,它是整个程序的入口点,继承自JFrame或者实现了Runnable接口。在这个主类中,开发者会初始化GUI组件,如创建一个JFrame窗口,并在其中添加显示日期的JLabel,以及可能的按钮或菜单...

    银行家算法JAVA代码实现,附带图形化界面

    1. **Banker.java**:主类,包含银行家算法的核心逻辑,包括初始化系统资源、进程需求、已分配资源等,并进行安全性检查和资源分配。 2. **Process.java**:表示进程的类,包含进程ID、最大需求、当前需求、已分配...

    错误:找不到或无法加载主类com.xxx.xxx.Application(完美解决)

    1. **检查并修复类路径**:确保所有相关的库和类文件都在类路径中,包括你的主类。 2. **更新Maven配置**:在`pom.xml`中正确设置`<mainClass>`标签,例如: ```xml <groupId>org.apache.maven.plugins ...

    用java写的多线程聊天程序GUI界面socket实现

    1. `ChatServer`: 服务器端的主类,负责创建ServerSocket,监听客户端连接,并为每个连接创建新的线程。 2. `ChatClient`: 客户端的主类,创建Socket连接到服务器,并设置GUI界面。 3. `ChatThread`: 服务器端的子线...

    错误:找不到或者无法加载主类

    1. `CLASSPATH`:用于指定 Java 类文件的搜索路径。 2. `JAVA_HOME`:用于指定 JDK 的安装目录。 3. `PATH`:用于指定可执行文件的搜索路径。 4. `JAVA_HOM`:用于指定 JDK 的安装目录(与 `JAVA_HOME` 相同)。 ...

    Java包与文件操作

    文件操作在Java中主要通过`java.io`包实现,例如使用`File`类来表示文件对象,`FileInputStream`和`FileOutputStream`进行读写操作。不过,描述中没有具体说明如何测试文件操作,这可能是通过在类中使用文件I/O功能...

    班级通信录java代码

    3. Java 中的类和对象:资源中定义了两个类:STU 和 Frm_Main,分别用于处理主类和主框架的逻辑。 Swing 组件库 1. JFrame 和 Container:资源中使用了 JFrame 和 Container components 来创建图形用户界面。 2. ...

    MyEclipse 的Java 开发

    完成新建后,MyEclipse会自动打开编辑窗口,显示包、主类和主方法的框架。在编辑窗口中编写代码,保存时,MyEclipse会自动进行检查和编译。 7. **运行程序** 程序编写完成后,可以点击`Run` -> `Run`或`Run` -> `...

    基于YOLOV5实现的一个识别照片中人们是否戴口罩的基础应用源码+模型+数据集,带用QT实现的人机界面

    基于YOLOV5实现的一个识别照片中人们是否戴口罩的基础应用源码+模型+数据集,带用QT实现的人机界面 训练过程: 在models文件夹下建立一个mask_yolov5s.yaml的模型配置文件,设定nc =2 表示这次训练的分类有两类:...

Global site tag (gtag.js) - Google Analytics