标准部件库(Standard Widget Toolkit,SWT)是基于JAVA环境下的一个新的类库,提供Java环境下的图形程序编程接口。作为Eclipse项目的一部分。SWT允许开发人员建立有效的,可移植的应用程序。其特点是直接采用Java本地程序调用接口,使用具体操作系统的资源。比之Swing更进一步。关于AWT,SWING及SWT的比较,相关资料非常多。这里就不再说明了。JFACE是构建于SWT之上的类库,提供更为方便的编程接口。所以通常编写SWT界面程序首先采用JFACE支持接口。如不完整,再考虑SWT。以下先通过实例来比较SWT及JFace程序的结构特点。然后重点讨论JFace框架中的菜单,工具栏的建立。
1、SWT程序
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.SWT;
public class HelloWorld
{
public static void main(String[] args)
{ Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.CENTER); //建立标签控件
label.setText("Hello, World");
label.setBounds(shell.getClientArea());
shell.open();
//事件循环
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();}
}
}
2、JFACE程序
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
public class HelloWorld extends ApplicationWindow {
//构造函数
public HelloWorld() {
super(null);
}
public void run() {
setBlockOnOpen(true); //防止重复加载
open();
Display.getCurrent().dispose();
}
// 创建主窗体的内容区,该过程供框架程序调用
protected Control createContents(Composite parent) {
// Create a Hello, World label
Label label = new Label(parent, SWT.CENTER);
label.setText("Hello, World");
return label;
}
//主程序
public static void main(String[] args) {
new HelloWorld().run();
}
}
其中
ApplicationWindow
类表示整个窗体。
在
JFace
程序中,并没有直接涉及
Display
,
Shell
这些概念,而是直接从用户的角度出发。提供菜单,工具栏目,内容区等概念。并并分别提供提供可重写的过程如
createMenuManager
等。另一方面,
JFace
也封装了事件循环机制。从框架上看,更加非过程化。
3、完整的JFace框架
public class EXAM extends ApplicationWindow {
// JFace
事件
public EXAM() {
super(null);
addStatusLine(); //
添加状态栏
addMenuBar(); //
添加菜单条
addToolBar(SWT.FLAT | SWT.WRAP); //
添加工具栏
}
//
创建内容区
protected Control createContents(Composite parent) {
……
}
//
创建菜单(管理器)
protected MenuManager createMenuManager() {
……
}
//
创建状态栏
(
管理器
)
protected StatusLineManager createStatusLineManager() {
……
}
//
创建工具栏(管理器)
protected ToolBarManager createToolBarManager(int style) {
……
}
//
创建
CoolBar
(管理器)
protected CoolBarManager createCoolBarManager(int style) {
……
}
窗体框架会自动加载内容区。但状态栏、菜单及工具栏可加可不加,若加则在该类的构造函数里加,如
addMenuBar()
。该函数并不保证建立菜单,只负责调用
createMenuManager
方法。可在
createMenuManager
方法内编写建立菜单的代码。
4、菜单的建立
菜单的建立需要解决两个问题,一是菜单的层级关系,二是菜单事件执行,包括快捷键执行。
SWT
的菜单机制较为复杂,这里只讨论
JFACE
机制。以下是创建菜单的程序。
protected MenuManager createMenuManager() {
//
定义一菜单项。参数为
null
表示最上层的菜单(管理器)。
MenuManager main_menu=new MenuManager(null);
MenuManager action_menu=new MenuManager("&File");
main_menu.add(action_menu); //
成为
main_menu
的下级菜单
action_menu.add(new FillLayoutAction());
return main_menu;
}
必须说明的是,这里面菜单项,工具栏项都加了Manager。这里面显然不是SWT中的菜单项类,工具栏项类。XXXManager是包装类,包装上述对象。这也是设计模式中的一种其特点是在不改变原始类的基础上添加新的功能。
菜单的层级关系。通过添加的方式决定,上级菜单通过
add
方法添加下级菜单。最下级菜单是
Action
类。
Action
类将快捷键、显示文字图片及执行绑定在一起,构成了一个独立的对象。之所以称为
Action
,而不叫
Menuitem
(或
MenuManager
)是因为该对象既可以加到菜单中形成菜单项,也可加到工具栏中形成工具栏项。以下是
Action
类的一个实例。
public class FillLayoutAction extends Action{
//
构造函数
public FillLayoutAction() {
super("&Trigger@Ctrl+O", AS_PUSH_BUTTON);
setToolTipText("
打开
");
setImageDescriptor(ImageDescriptor.createFromFile
(this.getClass(),"eclipse.gif"));
}
public void run() {
//
执行该菜单项的代码。
}
}