RSS
热门关键字:
当前位置 : 主页>编程开发>java编程>入门>列表

步入SWT/JFace世界,你还等什么

来源:我要研发网 作者: 时间:1970-01-01 点击:



本文示例源代码下载

字串2

  本文主要讨论Java中GUI图形库之一:SWT/JFace。在本文第一部分,将解释什么是SWT/JFace以及如何安装SWT/JFace。在本文第二部分将以实例方式讨论如何使用SWT/JFace编写GUI程序。

字串8

  一、 进入SWT/JFace世界

字串6

  1. 什么是SWT/JFace

字串4

  Java是一种强大编程语言。但强大就意味复杂,尤其是和Java相关名词就象天上星星一样,数都数不过来。在本文中就涉及到两个比较常用名词SWT和JFace。在标题中将SWT和JFace放到一起,并不是说SWT和JFace是一个意思,而是说它们关系非常紧密。 字串4

  基于Java图形库最主要有三种,它们分别是Swing、AWT和SWT。其中前两个是Sun随JDK一起发布,而SWT则是由IBM领导开源项目(现在已经脱离IBM了)Eclipse一个子项目。SWT执行效率非常高。这是由于SWT底层是由C编写。由于SWT通过C直接调用系统层GUI API。因此,使用SWT编写GUI程序,在外观上就和使用C 、Delphi(在Windows下)编写程序完全一样。它这一点和AWT类似。AWT在底层也是使用C直接调用系统层GUI API。但它们是有区别,最大区别可能就是一个是Sun提供,一个是Eclipse自带。这就意味着如果使用AWT,只要机器上安装了JDK或JRE,发布软件时无需带其它库。而如何使用SWT,在发布时必须要自带上SWT*.dll(Windows版)或*.so(Linux/Unix版)文件以及相关*.jar包。还有就是它们所提供图形接口有一些差异。SWT可能更丰富一些,我们可以看看Eclipse界面就知道了。但随着Sun对AWT库不断更新,AWT图形表现能力也在不断地提高。 字串9

  虽然SWT很强大,但它比较底层。也就是说它一些功能在使用上还比较低级,不太符合面向对象特征。因此,在SWT基础上又开发了JFace。JFace在SWT上进行了一定扩展。因此,也可说JFace是基于SWT,就象在VC中使用MFC来包装Win32 API一样。

字串9

  2. SWT/Face安装

字串6

  在发布使用SWT/JFace编写GUI程序时,要随程序带上相应库文件。对于Windows版SWT来说,SWT包含有4个dll文件和一个jar文件。它们是swt-awt-win32-3305.dll、swt-gdip-win32-3305.dll、swt-wgl-win32-3305.dll、swt-win32-3305.dll和swt.jar。在发布时,要将4个dll文件放到path路径中,或者使用-Djava.library.path设置相应路径。将swt.jar放到classpath路径中,或使用-classpath设置相应jar包。而对于JFace,除了上述5个文件外,还要带上5个jar包: 字串8

org.eclipse.core.runtime_3.1.2.jar
org.eclipse.jface_3.1.1.jar
org.eclipse.jface.text_3.1.2.jar
org.eclipse.osgi_3.1.2.jar
org.eclipse.text_3.1.1.jar

  这5个jar包都可以在eclipseplugins目录中找到,在这5个文件后面版本号可能会因为eclipse版本号不同而不同,但前面部分都是一样。读者在找这些jar包时应注意这一点。 字串6


字串7

  SWT开发包可以从http://www.eclipse.org单独下载,也可以从eclipseplugins目录复制。而JFace开发包并未提供单独下载,因此,JFace开发包必须要从plugins目录得到。 字串8

  二、 让我们编写第一个程序吧

字串7

  学习一种新技术方法就是去使用它。下面就让我们来使用SWT和JFace来分别实现同一个程序。这个程序是一个简单记事本程序。在上面有三个按纽,分别是"新键"、"打开","保存",下面是一个文本框,用于编辑文本信息。下面让我们先来看一下使用SWT实现程序界面:

字串3

  

字串9

  图1 使用SWT实现记事本程序界面

  怎么样,看看上面界面是不是和用Delphi、VC做界面完全一样!!

字串3

  1. 用SWT实现 字串3

  不论一个程序带不带GUI,都必须有一个入口点,对于Java来说,这个入口点就是main函数。因此,在编写程序之前,我们必须定义一个类,并且这个类中必须有个main函数。 字串2

import org.eclipse.swt.widgets.*;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import java.io.*;
public class FirstSWT
{
 // 用于记录是否已经打开或保存了一个文件,如果已经打开或保存了一个文件,
 // 这个变量就是这个文件名子
 private static String fn = "";
 public static void main(String[] args)
 {
  … …
 }
}

  上面四个import将导入一些在本程序中要用到jar包,前三个是SWT包,最后一个是Java标准输入输出包。

字串5

  1、建立窗体

字串6

  任何一个GUI程序,都至少有一个窗体(在本程序中只有一个窗体)。因此,下面我们就在main函数中建立这个窗体。

字串2

display = new Display();
shell = new Shell(display, SWT.DIALOG_TRIM);
shell.setText("第一个SWT程序");
shell.setSize(400, 300);

  在上面4行代码中涉及到了两个类:Display和Shell。这两个类都是在FirstSWT中定义私有静态类,之所以定义成全局,是因为在以后按钮事件类中要使用它们。下面是它们定义: 字串1


字串3

private static Display display;
private static Shell shell;

  后面2条语句通过调用Shell类setText和setSize方法,设置了窗口标题和尺寸。 字串5

  下面解释一下Display和Shell类是什么。

字串2

  SWT在底层实现上分为两层:系统层和用户层。系统层就是直接和操作系统平台打交道,系统层存在依赖于操作系统平台。在这里,系统层就是Display类。Display功能就是在系统和用户之间架起一座桥梁,也就是说使用户访问系统资源透明化。而Shell类是直接和用户打交道,因此,它属于用户层。通过Shell类可以控制窗体中控件、窗体本身属性等。而Shell通过Display这座桥梁访问系统级API。

字串6

  l 向窗体中添加控件 字串1

  接下来我们先在这个窗体上建立三个按钮,代码如下: 字串5

Button newButton = new Button(shell, SWT.PUSH);
newButton.setLocation(2, 5);
newButton.setSize(50, 20);
newButton.setText("新建");
Button openButton = new Button(shell, SWT.PUSH);
openButton.setLocation(60, 5);
openButton.setSize(50, 20);
openButton.setText("打开");
Button saveButton = new Button(shell, SWT.PUSH);
saveButton.setLocation(118, 5);
saveButton.setSize(50, 20);
saveButton.setText("保存");

  按钮类是Button,在建立时,Button需要两个参数,一个是Shell对象,另外一个是按钮类型,在本例中,我们使用SWT.PUSH类型(一般按钮类型)。 字串4

  注:和SWT相关常量都定义在了SWT 中。

字串2

  后面3条语句分别设置了三个按钮位置,尺寸和按钮标题。

字串7

  最后在3个按钮下方建立一个文本框 字串5

text = new Text(shell, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
text.setLocation(2, 30);
text.setSize(shell.getClientArea().width - 4, shell.getClientArea().height - 35);

  文本框类是Text,和按钮不同是,由于文本框需要在按钮事件中被访问,因此,文本对象必须定义成全局字串3

private static Text text;

  1、添加控件事件代码

字串3

  现在让我们为三个按钮控件中加入事件代码。和大多数语言不同是,按钮单击事件不叫Click,而叫Selection。一般需要将Selection事件代码放到一个从SelectionAdapter类继承子类中。然后通过按钮类addSelectionListener方法将这个事件类实例传入按钮类实例中。但为了简便起见,我们使用隐式建立对象方法来建立事件类对象。下面是"新建"按钮事件代码。 字串9


字串9

newButton.addSelectionListener(new SelectionAdapter()
{
 public void widgetSelected(SelectionEvent event)
 {
  fn = "";
  shell.setText("第一个SWT程序");
  text.setText("");
 }
});

  由于SelectionAdapter是一个抽象类,它有一个抽象方法widgetSelected,在上述代码被override了。在"新建"按钮中将全局文件名赋成空串,并将窗体标题赋成初始状态,最后将文本框清空。 字串4

  接下来让我们看看"打开"按钮事件代码: 字串8

openButton.addSelectionListener(new SelectionAdapter()
{
 public void widgetSelected(SelectionEvent event)
 {
  FileDialog dlg = new FileDialog(shell, SWT.OPEN);
  String fileName = dlg.open();
  try
  {
   if (fileName != null)
   {
    // 打开指定文件
    FileInputStream fis = new FileInputStream(fileName);
    text.setText("");
    BufferedReader in = new BufferedReader(new InputStreamReader(fis));
    String s = null;
    // 将指定文件一行一行地加到文本框中
    while ((s = in.readLine()) != null)
     text.append(s "
");
   }
   if (fileName != null)
   {
    fn = fileName;
    shell.setText(fn);
    MessageBox successBox = new MessageBox(shell);
    successBox.setText("信息");
    successBox.setMessage("打开文件成功!");
    successBox.open(); 字串3
   }
  }
  catch (Exception e)
  {
   MessageBox errorBox = new MessageBox(shell, SWT.ICON_ERROR);
   errorBox.setText("错误");
   errorBox.setMessage("打开文件失败!");
   errorBox.open();
  }
 }
});

  上面代码基本逻辑是使用打开对话框选择一个文件,使用FileInputStream将这个文件打开,并且将文件中内容一行一行地加入到文本框中,如果这个过程失败,显示错识对话框,如果成功,将fn变量和窗体标题栏都赋成这个文件名。

字串1


字串8

  最后让我们实现"保存"按钮事件代码。

字串1

saveButton.addSelectionListener(new SelectionAdapter()
{
 public void widgetSelected(SelectionEvent event)
 {
  try
  {
   String fileName = null;
   if (fn.equals(""))
   {
    FileDialog dlg = new FileDialog(shell, SWT.SAVE);
    fileName = dlg.open();
    if(fileName != null)
     fn = fileName;
   }
   if (fn != "")
   {
    FileOutputStream fos = new FileOutputStream(fn);
    OutputStreamWriter out = new OutputStreamWriter(fos);
    out.write(text.getText());
    out.close();
    shell.setText(fn);
    MessageBox successBox = new MessageBox(shell);
    successBox.setText("信息");
    successBox.setMessage("保存文件成功!");
    successBox.open();
   }
  }
  catch (Exception e)
  {
   MessageBox errorBox = new MessageBox(shell, SWT.ICON_ERROR);
   errorBox.setText("错误");
   errorBox.setMessage("保存文件失败!"); 字串5
   errorBox.open();
  }
 }
});

  这段代码基本逻辑是如果当前已经打开一个文件或已经将当前新建文件保存过了,在点击"保存"按钮时,不再显示保存对话框,而直接将文件保存,否则,将显示一个保存对话框,通过这个对话框可以选择一个文件名,然后再保存。 字串4

  1、让我们最后画龙点睛吧 字串6

  程序到这已经基本完成了,但还需要进行最后一步,就是对事件进行监听。在main函数最后,可以加上如下代码实现这个功能。

字串2

shell.open(); // 显示窗体
while (!shell.isDisposed()) // 当窗体未被关闭时执行循环体内代码
{
 // 如果未发生事件,通过sleep方法进行监视事件队列
 if (!display.readAndDispatch())
 {
  display.sleep();
 }
}
display.dispose(); // 释放底层资源

  看看上面代码,是不是有点象MFC监听事件代码!! 字串5

  2、用JFace实现

字串2


字串8

  使用JFace实现GUI程序和SWT最大区别就是JFace窗体类必须从ApplicationWindow继承。 字串4

import org.eclipse.jface.window.ApplicationWindow;
public class FirstJFace extends ApplicationWindow
{
 public static void main(String[] args)
 {
  … …
 }
}

  另外一个不同是在设置窗体上,JFace通过ApplicationWindow类提供一系列事件函数,通过在这些函数中编写代码,可以很方便地对窗体进行操作。如可以在createContents函数中向窗体中加入控件。

字串9

protected Control createContents(Composite parent)
{
// 这里边代码就是上述建立控件代码,只是要将shell换成parent
}

  由于使用JFace操作控件方式和SWT类似,本文将不再详细讨论,感性趣读者可以参考本文提供源代码。使用JFace程序界面和SWT完全一样,界面如图2所示: 字串2

   字串3

  图2使用JFace实现记事本程序界面

字串2

字串4

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
相关文章