形式系统

计算机专业教学
posts - 48, comments - 150, trackbacks - 0, articles - 10
  教师博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

SWT/JFACE编程(1)

Posted on 2006-04-23 17:48 形式系统 阅读(1045) 评论(0)  编辑 收藏 引用 网摘 所属分类: 编程开发


      标准部件库(Standard Widget Toolkit,SWT)是基于JAVA环境下的一个新的类库,提供Java环境下的图形程序编程接口。作为Eclipse项目的一部分。SWT允许开发人员建立有效的,可移植的应用程序。其特点是直接采用Java本地程序调用接口,使用具体操作系统的资源。比之Swing更进一步。关于AWT,SWING及SWT的比较,相关资料非常多。这里就不再说明了。JFACE是构建于SWT之上的类库,提供更为方便的编程接口。所以通常编写SWT界面程序首先采用JFACE支持接口。如不完整,再考虑SWT。以下先通过实例来比较SWTJFace程序的结构特点。然后重点讨论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() {

              // 执行该菜单项的代码。

       }

}


只有注册用户登录后才能发表评论。