SWT/JFace开发入门指南(九)〈转帖〉
JFace 的 Hello,world !
我们仍然是从一个最简单的 Hello,world! 开始介绍 JFace 。为了更形象一些,首先把程序列出来:
2 public class HelloJface extends Window {
3
4 public HelloJface(Shell arg0) {
5 super(arg0);
6 }
7 @Override
8 protected Control createContents(Composite parent) {
9 Text text = new Text(parent, SWT.NONE);
10 text.setText( " Hello,world! " );
11 return parent;
12
13 }
14 /* *
15 * @param args
16 */
17 public static void main(String[] args) {
18
19 HelloJface demo = new HelloJface( null );
20 demo.setBlockOnOpen( true );
21 demo.open();
22 Display.getCurrent().dispose();
23
24 }
25 }
26
代码段12
首先我们从这段代码来看一下使用 JFace 和单纯地使用 swt 写程序有什么不一样:
在 swt 程序中,我们需要自己创建 Display ,自己创建 Shell ,但是在这里,我们只需要:
创建一个继承自 Window ( org.eclipse.jface.window.Window )的类
在这个类的 createContents 方法中为窗口添加部件
将这个对象的 blockOnOpen 属性设定为 true ,这个属性的含义就和它的名字一样,窗口会一直保持打开的状态(接收各种事件)直到被关闭。
调用这个对象的 open 方法即打开了窗口
由于设定了 blockOnOpen ,窗口会保持接受各种事件,知道用户(或者程序)关闭了它。
在关闭以后,程序继续向下运行,我们需要将资源释放掉,所以有了这样一句话:
Display.getCurrent().dispose();
其中 Display.getCurrent() 得到了程序的 display 对象,并进而调用 dispost() 方法释放了各种资源。
其实这也是我们写一个 JFace 程序一般的步骤,当然我们可能还会添加事件处理之类,但是大体上都是这样的。
因为这个程序运行的结果其实和我们以前 swt 的 Hello,world! 是一样的,所以在这里我也不再贴图了。大家可以自己运行看一下。
Window , ApplicationWindow , Dialog
关于 Window 的 Q&A
JFace 中的 Window 就是一个窗口。我们知道在 swt 中窗口是用 Shell 表示的,而 JFace 中的 Window 其实也可以看作是对于 Shell 的一种封装。
在 org.eclipse.jface.window.Window 中,有几个方法需要我们注意,为了更加突出各自的功能,我把这些介绍写成 Q&A 的形式:
Q :如何为窗体添加各种功能部件?
A : 方法就是重载 createContents 方法,这个方法中我们可以给窗体中创建一些子部件,比如 Text,Lable,Composite 之类,在前面的 demo 中我们是只创建了一个文本框。
Q :如何定义窗体的风格?
A : 可以通过调用 setShellStyle 方法来设定窗体的风格,比如如果我们在前面程序的 main 函数中添加这样一句话(在 demo.open(); 之前):
demo.setShellStyle(SWT.DIALOG_TRIM);
那么出现的就是一个对话框风格的窗体。
Q: 如何定义窗体的 Layout ,标题等属性
A : 可以通过重载 configureShell 方法实现,比如下面这样一段程序:
protected void configureShell(Shell shell) {
shell.setText( " JFace Window " );
shell.setLayout( new RowLayout(SWT.VERTICAL));
}
就设定了窗口标题为“ JFace Window ”, Layout 也设定为 RowLayout 。
默认窗体的 Layout 为 GridLayout 。
这个简短的 Q&A 就到这里为止。对于 Window 的介绍也到这里告一段落,下面我们简单地看一下 Window 的两个子类: ApplicationWindow ( org.eclipse.jface.window.ApplicationWindow )和 Dialog ( org.eclipse.jface.dialogs.Dialog )
ApplicationWindow
ApplicationWindow 除了具有 Window 的特性以外,还允许我们方面地添加菜单,工具条( Toolbar 或者 Coolbar ),状态条之类的。关于这方面的特性我会在后面的文章中做单独介绍,这里就不再赘述了。
对话框
JFace 中的 Dialog 是一个抽象类,所以你必须使用它的子类或者自己写一个它的子类。当然了,实际上你根本没有必要去自己继承。
离题万里: swt 中的 MessageBox
关于对话框,首先我要给大家介绍的却是一个 swt 中的 MessageBox ( org.eclipse.swt.widgets.MessageBox )。实际上,如果你看过这个系列文章中介绍 swt 事件模式的内容的话,可能早就注意到我在里面使用过 MessageBox 了。
Swt 中的 MessageBox 允许我们通过指定风格来改变对话框的外观,比如如果对话框的风格中包含 SWT.OK ,它就会有一个确定按钮;如果包含 SWT.CANCEL ,就会有一个取消按钮,如果包含 ICON_QUESTION 那么弹出的对话框就有一个问号图标,等等吧。
比如我们看下面这段程序:
dialog.setText( " Hello " );
dialog.setMessage( " Hello,world! " );
dialog.open();
代码段 13
这里我们从构造函数的 style 参数可以看出,这是一个带有信息图标(一个感叹号)和一个确定按钮的对话框。具体图示见下面:
图 14
对比: JFace 中的 MessageDialog
前面一小节中,我简单介绍了一下 swt 中的 MessageBox 。在 JFace 中,我们使用 MessageDialog ( org.eclipse.jface.dialogs.MessageDialog )来实现类似的功能。
如果要实现我们在上面所演示的那样一个带信息提示和确定按钮的对话框,我们只需要这样写:
运行出来以后,对话框的大小可能和 swt 中的有一些区别。不过这样是不是很方便呢?其实 JFace 能做的事情通过 swt 编程也都可以做到,不过一般说来, JFace 都简化了编程。
在 MessageDialog 中,类似于 openXxxx 的静态方法还有好几个,比如:
openWarning :打开一个带警告图标的对话框
openConfirm :打开一个只有确定和取消按钮的对话框
…
不过你也许注意到了,这些静态方法返回类型都不一样,有的是 void, 有的是 boolean ,这些返回值(如果有的话)就反应了用户选择了哪个按钮。比如 openConfirm ,如果按了确定,那么返回的就是 true 。
输入框: InputDialog
相对来说,输入对话框的用法可能会比较负责一些,你必须 InputDialog 对象,然后调用它的 open 方法打开对话框,获得这个方法的返回值(以确定用户是点击了确定还是取消)。然后再通过 getValue() 方法获得用户的输入。
为了更加形象,我们举一个例子。我们还是用前面的 Hello,world! 程序,不过把它的 createContents 方法改成下面一段代码:
2 protected Control createContents(final Composite parent) {
3 Button button = new Button(parent, SWT.NONE);
4 button.setText( " Click me! " );
5 button.addSelectionListener( new SelectionAdapter() {
6 @Override
7 public void widgetSelected(SelectionEvent arg0) {
8
9 InputDialog input = new InputDialog(parent.getShell(),
10 " Input Dialog Title " , " Please input some string here: " ,
11 " initial value " , null );
12 if (input.open() == Window.OK)
13 {
14 System. out .println(input.getValue());
15 }
16 }
17
18 });
19 return parent;
20 }
21
代码段 14
运行之后,界面如下面图示:
图 15
如果按了确定的话,控制台会显示你输入的信息
小结
因为前一段有些事情,所以都一直没有来得及写这个系列的文章。今天贴出的这篇文章中,通过一个简单程序演示了一个 JFace 程序的基本写法,同时也顺便提了一下 Window 和它的两个子类。关于对话框我只向大家介绍了两种最常用的,其实还是有很多的,这需要大家在实践中不断探索。