频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源:天极开发 作者: 出处:巧巧读书 2006-11-15 进入讨论组
二、 让我们编写第一个程序吧

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

步入SWT/JFace世界,你还等什么(图一)
图1 使用SWT实现的记事本程序界面


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

  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);

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

private static Display display;
private static Shell shell;

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

  下面解释一下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("");
 }
});

  由于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();
  }
 }
});

  上面代码的基本逻辑是使用打开对话框选择一个文件,使用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();
  }
 }
});

  这段代码的基本逻辑是如果当前已经打开一个文件或已经将当前的新建文件保存过了,在点击"保存"按钮时,不再显示保存对话框,而直接将文件保存,否则,将显示一个保存对话框,通过这个对话框可以选择一个文件名,然后再保存。浏览URL http://www.qqread.com/java/2006/11/w277880.html 更多文章 更多内容请看SWT/Jface专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章