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和它的两个子类。关于对话框我只向大家介绍了两种最常用的,其实还是有很多的,这需要大家在实践中不断探索。