二、 让我们编写第一个程序吧
学习一种新技术的最好方法就是去使用它。下面就让我们来使用SWT和JFace来分别实现同一个程序。这个程序是一个简单的记事本程序。在上面有三个按纽,分别是"新键"、"打开","保存",下面是一个文本框,用于编辑文本信息。下面让我们先来看一下使用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 (22篇文章)
- 125条常见的java面试笔试题大汇总 (23470次浏览)
- 十四种Java开发工具点评 (16011次浏览)
- JAVA中配置环境变量设置方法大全 (14586次浏览)
- 论Java外观模式 (1091次浏览)
- 英文打字练习 (718次浏览)
- Java编程十大典型问题详解(1) (637次浏览)
- Java路径问题最终解决方案 (598次浏览)
- Ruby,Java的劲敌 (582次浏览)
- Java学习从入门到精通(附FAQ)2 (579次浏览)
- JAVA高手解析XML配置文件的读取操作 (568次浏览)




