JFace中的事件模式
大家好,因为工作的事情搞了一个多月,现在终于暂时安定下来了。这一系列的文章我也会继续往下写。
在这一节中,我会向大家介绍
JFace
中的事件模式。其实我相信这篇文章的读者应该大部分都会接触
eclipse
,这样可能也会接触过
eclipse
的插件开发。就是没有接触过,大家也可能会有在
eclipse
里面新建工程的时候出于各种原因(比如好奇心)点了
plug-in project
的时候吧。其实作为一个程序员来讲,保持好奇是很重要的。如果你大概看过一个
plug-in project
的结构,虽然可能不能全部理解,但是我相信也应该对
Action
之类有一些了解。我们这一节主要就是围绕
Action
来写的。为了增加可读性,我们首先介绍几个名词,这些名词都可以从
eclipse
的文档中找到。
什么是
Action
JFace
中的一个
Action
可以简单地理解成一个命令。那么它和事件有什么关系呢?比如说我点了一个菜单,那么点击本身就是一个事件,但是这个事件的影响就是相应的命令被执行了。大家日常使用的一些软件比如
Office
都是有菜单和工具栏的,而一个菜单项和一个工具栏可能执行的是同一个命令。比如
Word
里面要新建一个文档的话可以通过
“
文件
”
菜单下的
“
新建
”
实现,也可以通过点击工具栏上相应的图标实现。这个新建地功能本身在
JFace
里面是可以使用
Action
来实现的。
在
JFace
里面,
Action
可以关联到菜单,工具条,以及按钮(也就是
Button
)。当然关于如何关联,我们会在后面向大家详细介绍。
Action
在
JFace
里面的定义是一个接口
org.eclipse.jface.action.IAction
。当然实际上你写程序的时候必须自己来实现这个接口,写出自己的
Action
类来。
IAction
里面最重要的方法是
run()
,它也是事件触发以后执行的代码。其他的方法都是一些辅助性的方法,不是我们要关注的重点。为了能够将精力集中在我们所关注的事情上,通常我们不是实现
IAction
接口,而是通过继承
org.eclipse.jface.action.Action
这个抽象类来实现
Action
。下面我们通过一个例子来说明
Action
的用法。
Hello,Action!
首先我们先不管用户界面,先定义一个最简单的
Action
类。
1 public class HelloAction extends Action{
2 private Shell shell;
3
4 public HelloAction(Shell shell) {
5 super("&Hello",Action.AS_PUSH_BUTTON);
6 this.shell=shell;
7 }
8
9
10 @Override
11 public void run() {
12 MessageDialog.openInformation(shell, "Hello", "Hello,Action!");
13 }
14
15 }
16
代码段
1
5
这段代码其实应该还是很好读懂的。带参的构造函数带进来一个
Shell
实例,而
run()
方法说明了这个
Action
的功能就是显示一个对话框。第
5
行中的代码调用了父类的构造函数,其中第一个参数是
Action
对应的文本,前面的
&
符号表明了
H
是热键,而第二个参数则是一个风格参数。如果大家继续向后看的话,就会发现这个
Action
被附加在了一个按钮上面,而按钮上显示的文本就是
Hello
,如果你定义的风格不是
AS_PUSH_BUTTON
而是
AS_RADIO_BUTTON
的话就会发现按钮已经不是一个纯粹的按钮了,而是一个单选钮。相应的其他风格可以参照
Javadoc。
1
2 public class HelloJface extends ApplicationWindow {
3 public HelloJface(Shell shell) {
4 super(shell);
5 }
6 @Override
7 protected Control createContents(Composite parent) {
8 HelloAction action=new HelloAction(parent.getShell());
9 ActionContributionItem aci=new ActionContributionItem(action);
10 aci.fill(parent);
11 return parent;
12 }
13 /**
14 * @param args
15 */
16 public static void main(String[] args) {
17
18 HelloJface demo = new HelloJface(null);
19 demo.setBlockOnOpen(true);
20 demo.open();
21 Display.getCurrent().dispose();
22
23 }
24 }
代码段
16
和前面一节的代码相比,我们只是修改了
createContents
方法。首先创建了一个
HelloAction
的实例,然后又创建了一个
ActionContributionItem
的实例,最后调用了这个实例的
fill
方法将按钮添加到窗口中,这就是全部了。是不是很简单呢?程序运行出来的效果如下图:
图
1
6
可能看了这个例子,你会认为
ActionContributionItem
这个类表示的就是一个按钮了。但是实际上并不是的,它在图形界面上表示成什么样子,随着不同的
fill
调用又有不同。在下一节中,我会向大家深入介绍
Contribution Item
以及
JFace
中的菜单,工具条等的应用。这一节就到这里结束了,因为刚刚换了工作环境,有很多事情需要去做,所以写得比较短,请大家见谅:)。
摘要: JFace
的
Hello,world
!
我们仍然是从一个最简单的
Hello,world!
开始介绍
JFace
。为了更形象一些,首先把程序列...
阅读全文
摘要: 几种特殊的部件
好像因为大家的抱怨比较多,感觉这一段
csdn
的
blog
似乎又有恢复稳定的迹象了,
^_^
。
...
阅读全文
使用
Layout
管理
UI
布局
我们在前面在一些例子中已经使用过
Layout
了。那么
Layout
到底是做什么的呢?
我们知道,在设计用户界面时候,我们可以采用的一种办法是手动的为每个部件设置合适当大小和位置。但是这样的话,如果你所要显示的部件比较多,编程量就会非常大,特别是考虑到窗体大小变化时候各种部件的重绘。而实际上,我们可以利用一些通用的规则或者说算法来安排这些部件的排列。比如下图所示的这个窗体:
图
10
很显然,对于这些规则化的部件排列,应该有一些更简单的办法,而不是在代码的各个部分写
xxx.setBounds
之类。
swt
给我们提供了这样的办法,就是使用
Layout
。
你可以把一个
Layout
看成是安排部件位置和大小的一个规则,在应用了
Layout
的
Composite
(我们在这里第一次提到了
Composite
,
Composite
就是一个能够包含其他控件的容器,比如
Shell
就是一个
Composite
,我们会在后面的部分详细介绍
Composite
)中,所有的子控件都会按照这个规则来进行排列。
在目前(写这篇文章的时候
eclipse
最新版本是
3.1M7
),
org.eclipse.swt.layout
包中包含四种已经定义好的
Layout
,它们分别是:
FillLayout
,
FormLayou
,
GridLayout
和
RowLayout
。我在这里不再一一作介绍,而是推荐大家看一下这篇文章《
Understanding Layouts in SWT
》。相信如果你有兴趣看完它的话,就会对
Layout
有比较深的了解。
摘要: 让你的
swt
程序动起来
在向使用者提供最差的用户体验方面,中国的
IT
企业始终走在时代的最前端。之所以有这样的感慨其实是来源于往
blog
上贴...
阅读全文
摘要: 写在前面的话
终于决定提起笔来写一篇关于
swt
和
JFace
编程的文章。在开始之前,我想先介绍一下你能够从将要出现的这一系列文章里得到什么,以及更重要的,你不能得到什么。我们的时间是如此之重要,以至于我们很难容忍...
阅读全文
摘要: 从
Hello, world!
开始了解
Display
和
Shell
在这一节中,我们从前面所列举出来的...
阅读全文