步入SWT/JFace世界,你还等什么
当前位置:以往代写 > JAVA 教程 >步入SWT/JFace世界,你还等什么
2019-06-14

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

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

副标题#e#

本文主要接头Java中的GUI图形库之一:SWT/JFace。在本文的第一部门,将表明什么是SWT/JFace以及如何安装SWT/JFace。在本文的第二部门将以实例的方法接头如何利用SWT/JFace编写GUI措施。

一、进入SWT/JFace世界

1.什么是SWT/JFace

Java是一种强大的编程语言。但强大就意味巨大,尤其是和Java相关的名词就象天上的星星一样,数都数不外来。在本文中就涉及到两个较量常用的名词SWT和JFace。在标题中将SWT和JFace放到一起,并不是说SWT和JFace是一个意思,而是说它们的干系很是细密。

基于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的图形表示本领也在不绝地提高。

固然SWT很强大,但它较量底层。也就是说它的一些成果在利用上还较量初级,不太切合面向工具的特征。因此,在SWT的基本上又开拓了JFace。JFace在SWT长举办了必然的扩展。因此,也可说JFace是基于SWT的,就象在VC中利用MFC来包装Win32 API一样。

2.SWT/Face的安装

在宣布利用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包:

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包都可以在eclipse的plugins目次中找到,在这5个文件后头的版本号大概会因为eclipse的版本号差异而差异,但前面的部门都是一样的。读者在找这些jar包时应留意这一点。

SWT的开拓包可以从http://www.eclipse.org单独下载,也可以从eclipse的plugins目次复制。而JFace的开拓包并未提供单独的下载,因此,JFace的开拓包必需要从plugins目次获得。

二、让我们编写第一个措施吧

进修一种新技能的最好要领就是去利用它。下面就让我们来利用SWT和JFace来别离实现同一个措施。这个措施是一个简朴的记事本措施。在上面有三个按纽,别离是"新键"、"打开","生存",下面是一个文本框,用于编辑文本信息。下面让我们先来看一下利用SWT实现的措施界面:

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

图1 利用SWT实现的记事本措施界面

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


#p#副标题#e#

1.用SWT实现

岂论一个措施带不带GUI,都必需有一个进口点,对付Java来说,这个进口点就是main函数。因此,在编写措施之前,我们必需界说一个类,而且这个类中必需有个main函数。

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的尺度输入输出包。

1、成立窗体

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

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

#p#分页标题#e#

在上面4行代码中涉及到了两个类:Display和Shell。这两个类都是在FirstSWT中界说的私有静态类,之所以界说玉成局的,是因为在今后的按钮事件类中要利用它们。下面是它们的界说:

private static Display display;
private static Shell shell;

后头2条语句通过挪用Shell类的setText和setSize要领,配置了窗口的标题和尺寸。

#p#副标题#e#

下面表明一下Display和Shell类是什么。

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

l 向窗体中添加控件

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

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范例(一般的按钮范例)。

注:和SWT相关的常量都界说在了SWT 中。

后头3条语句别离配置了三个按钮的位置,尺寸和按钮标题。

最后在3个按钮下方成立一个文本框

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,和按钮差异的是,由于文本框需要在按钮事件中被会见,因此,文本工具必需界说玉成局的。

private static Text text;

1、添加控件事件代码

此刻让我们为三个按钮控件中插手事件代码。和大大都语言差异的是,按钮的单击事件不叫Click,而叫Selection。一般需要将Selection事件代码放到一个从SelectionAdapter类担任的子类中。然后通过按钮类的addSelectionListener要领将这个事件类的实例传入按钮类的实例中。但为了轻便起见,我们利用隐式成立工具的要领来成立事件类的工具。下面是"新建"按钮的事件代码。

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

#p#副标题#e#

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

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

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 + "\r\n");
    }
    if (fileName != null)
    {
     fn = fileName;
     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("打开文件失败!");
    errorBox.open();
   }
  }
});

#p#副标题#e#

#p#分页标题#e#

上面代码的根基逻辑是利用打开对话框选择一个文件,利用FileInputStream将这个文件打开,而且将文件中的内容一行一行地插手到文本框中,假如这个进程失败,显示错识对话框,假如乐成,将fn变量和窗体的标题栏都赋成这个文件名。

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

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("生存文件失败!");
    errorBox.open();
   }
  }
});

#p#副标题#e#

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

1、让我们最后一语道破吧

措施到这已经根基完成了,但还需要举办最后一步,就是对事件举办监听。在main函数的最后,可以加上如下的代码实现这个成果。

shell.open(); // 显示窗体
while (!shell.isDisposed()) // 当窗体未被封锁时执行轮回体内的代码
{
  // 假如未产闹事件,通过sleep要领举办监督事件行列
  if (!display.readAndDispatch())
  {
   display.sleep();
  }
}
display.dispose(); // 释放底层的资源

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

2、用JFace实现

利用JFace实现GUI措施和SWT的最大的区别就是JFace的窗体类必需从ApplicationWindow担任。

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

别的一个差异是在配置窗体上,JFace通过ApplicationWindow类提供一系列的事件函数,通过在这些函数中编写代码,可以很利便地对窗体举办操纵。如可以在createContents函数中向窗体中插手控件。

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

由于利用JFace操纵控件的方法和SWT雷同,本文将不再具体接头,感性趣的读者可以参考本文提供的源代码。利用JFace的措施界面和SWT完全一样,界面如图2所示:

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

图2利用JFace实现的记事本措施界面

本文配套源码

    关键字:

在线提交作业