JFace是继承自SWT并用于简化通用UI开发工作的一套UI工具,它在其API以及实现上都是界面与系统独立的,并且被设计为运用时不对其实现的SWT隐藏。
总的来说,JFace的出现就是为了提高用SWT组件进行UI开发的效率,它对一些SWT常用组件进行了一定的封装,使其实现起来更加简便,使我们在开发时候可以把更多的注意力集中在具体功能的实现上面,而不是为界面设计而大费周章。
JFace为了简化窗口的设计特别设计了类,比如ApplicationWindow这一个类,它里面包含了六个默认方法,分别用于创建内容、菜单、工具栏、状态栏以及初始化和销毁。这样使整个程序的结构易于控制,而不是像单独用SWT开发时一切需要程序员自己实现。
下面我举一个非常简单的例子来说明JFace是如何实现一个窗口的。
首先,我们列出要写使用的包。
package org.eclipseguide.jface;
import org.eclipse.jface.action.*;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
第二步,我们要写出主类以及继承的类还有成员变量。
public class JFaceExample extends ApplicationWindow
{
private ExitAction m_ExitAction;
//这个类是我们要自己写的类,继承自Action。
接着,我们要申明构造函数,在构造函数里面,我们需要首先调用父类的构造函数。
Public JFaceExample(){
super(null); //父类接受一个参数为Shell类的对象作为父窗口句柄,
//如果这个窗口为顶级窗口的话,则传null
m_ExitAction = new m_ExitAction(this);
this.addMenuBar();
//这三个为父类方法,作用已经通过方法名表示得很清楚
this.addStatusLine();
this.addToolBar(SWT.FLAT | SWT.WRAP);
}
当它们时被程序调用时,它们依次调用createMenuManager(),createStatusLineManager(),以及createToolBarManager()。如果你希望能有一个菜单栏,状态条,或者一个工具栏,那就需要重载这些方法,确保它们返回正确的类型。我们很快就会看到这些方法的实现。
createContents()方法在你创建自己的程序时需要重载,以便创建并放置你的窗口小部件。在这个示例中,你只需要设置程序窗体标题和状态条:
protected Control createContents(Composite parent)
{
getShell().setText("JFace Example");
setStatus("JFace Example v1.0");
return parent;
}
我们要注意的一点是,程序窗口是在窗口中所有部件全部创建之后才创建的。接下来我们初始化窗口大小。
protected void initializeBounds()
{
getShell().setSize(300, 200);
}
然后我们要做的工作是创建菜单,在SWT里面我们想创建菜单时很痛苦的事情,我们要写大量的代码,这样导致开发效率低下,而在JFace中,我们只需要在createMenuManager方法里面写少量代码即可。
protected MenuManager createMenuManager()
{
MenuManager menuBar = new MenuManager("");
MenuManager fileMenu = new MenuManager("&File");
MenuManager helpMenu = new MenuManager("&Help");
menuBar.add(fileMenu);
menuBar.add(helpMenu);
//由于helpMenu没有子项,所以它不会显示出来
fileMenu.add(m_ExitAction);
return menuBar;
}
StatusLineManager类提供了设置状态条文字的方法,可以用来控制显示在状态栏的一个进度条,也可以用来显示错误文字和图片:
protected StatusLineManager createStatusLineManager()
{
StatusLineManager statusLineManager = new StatusLineManager();
statusLineManager.setMessage("Hello, world!");
return statusLineManager;
}
创建一个工具栏只需创建ToolBarManager的一个实例,传入一个样式(style),然后加入任何动作(actions):
protected ToolBarManager createToolBarManager(int style)
{
ToolBarManager toolBarManager = new ToolBarManager(style);
toolBarManager.add(m_ExitAction);
return toolBarManager;
}
接下来就是我们熟悉的主函数了~~
public static void main(String[] args)
{
JFaceExample fe = new JFaceExample();
fe.setBlockOnOpen(true);
fe.open();
Display.getCurrent().dispose();
}
}
最后,我们要实现刚才的ExitAction类了。它继承自Action类,这个类是行为类,我们需要对它定义在它被激活时候所要做的事情。
首先,我们还是先引入要用的包。
package org.eclipseguide.jface;
import java.net.*;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.window.ApplicationWindow;
由于这个类比较简单,因此我一下子写出来,并且在必要的地方加注释。
public class ExitAction extends Action
{
ApplicationWindow m_Window;
public ExitAction(ApplicationWindow w)
{
m_Window = w; //得到窗口对象
setText("E&xit@Ctrl+W");
setToolTipText("Exit the application");
}
public void run() //这个方法用于定义被激活时的行为
{
window.close(); //当被激活时关闭窗口
}
}
这样,一个简单的窗口程序就算完成了。