创建插件项目
1. 选择主菜单“文件→新建→项目”命令,在弹出窗口中选择“插件开发→插件项目”,单击“下一步”按钮。
2. 进入下一个窗口,填入项目名myswt,单击“下一步”按钮。
3. 进入到下一个窗口,接受所有默认值,直接单击“完成”按钮。
4. 完成创建向导后,可以看到Eclipse中多了一个myswt项目,其中“插件依赖项”已经对支持SWT项目所需的jar包做好了引用。Src下的myswt包还用不到,这里将它删除掉。
创建HelloWorld程序
在myswt创建com.michael.swt包,在此包下创建一个HelloWorld类,然后把这个类改造为一个简单的SWT程序。
代码内容如下:
<b>package</b> com.michael.swt;
<b>import</b> org.eclipse.swt.widgets.Display;
<b>import</b> org.eclipse.swt.widgets.Shell;
<b>public</b> <b>class</b> HelloWorld {
/**
* <b>@param</b> args
*/
<b>public</b> <b>static</b> <b>void</b> main(String[] args) {
//Display负责管理事件循环和控制UI线程和其他线程之间的通信
<b>final</b> Display display=Display.getDefault();
<b>final</b> Shell shell=<b>new</b> Shell(); //shell是程序的主窗口
shell.setSize(327,253);//设置主窗口的大小
shell.setText("HelloWorld");//设置主窗口的标题
//-------创建窗口中的其他界面组件----------
//.......
//-------END---------
shell.layout();//应用界面布局
shell.open();//打开shell主窗口
<b>while</b> (!shell.isDisposed()){//如果shell主窗口没有关闭,则一直循环
<b>if</b>(!display.readAndDispatch()) //如果display不忙,就让display处于休眠状态
display.sleep();
}
display.dispose(); //释放display资源
}
}
从代码中可以看到SWT程序的几个特点:
它需要一个Display对象来支撑SWT界面的显示;
Shell是主窗口,其他所有界面组件(如按钮、文本框等)都创建于其中。
虽然这个程序涉及Display多线程操作,但在实际SWT编程中却很少关心这方面,基本是照搬同样的代码。
运行HelloWorld
选择主菜单“运行→运行方式→SWT应用程序”命令来运行HelloWorld.java,运行显示的是一个空白窗口。
HelloWorld更进一步
上面的HelloWorld程序比较简单,现在给界面加入一个按钮,当单击该按钮时能弹出一个对话框,要实现这个效果,在原HelloWorld类的省略号处加入如下代码:
Button button = <b>new</b> Button(shell,SWT.NONE); //创建一个按钮对象
button.setText(HelloWorld); //设置按钮上的文字
button.setBounds(88,94,100,25); //设置按钮在窗口中的位置和大小
//编写按钮被单击时的事件代码
button.addSelectionListener(<b>new</b> SelectionAdapter(){
<b>public</b> <b>void</b> widgetSelected(SelectionEvent e){
//弹出一个对话框,MessageDialog是JFace中的类
MessageDialog.openinformation(shell,"hello","HelloWorld");
})
代码还需要用Ctrl+Shift+O快捷键加入相关类的import语句,这时候要注意Button不要导入AWT的java.awt.Button,而应该导入SWT的org.eclipse.swt.widgets.Button.以后在写SWT程序时都要注意这个问题。代码修改后的运行效果下图。
完整代码如下:
<b>import</b> org.eclipse.swt.SWT;
<b>import</b> org.eclipse.swt.events.SelectionAdapter;
<b>import</b> org.eclipse.jface.dialogs.MessageDialog;
<b>import</b> org.eclipse.swt.events.SelectionEvent;
<b>import</b> org.eclipse.swt.widgets.Button;
Button button = <b>new</b> Button(shell,SWT.NONE); //创建一个按钮对象
button.setText("HelloWorld"); //设置按钮上的文字
button.setBounds(88,94,100,25); //设置按钮在窗口中的位置和大小
//编写按钮被单击时的事件代码
button.addSelectionListener(<b>new</b> SelectionAdapter(){
<b>public</b> <b>void</b> widgetSelected(SelectionEvent e){
//弹出一个对话框,MessageDialog是JFace中的类
MessageDialog.openInformation(shell,"hello","HelloWorld");
}
});
注意:
虽然Shell的类定义中没有final前缀,但我们依然不能不继承Shell类,因为Shell的父类Decorations有一个checkSubclass()方法,继承Shell的类都会在执行此方法时抛出异常“org.eclipse.swt.SWTException:Subclassing not allowed”。
在面向对象的设计原则中,组合优于继承。Eclipse鼓励遵循这一原则,所以不要轻易去继承SWT中的界面组件(如Shell类)来实现扩展,除非是那些最初设计目的就是说为了通过继承方式来扩展功能的类,例如对话框的Dialog类。一般来说,大部分SWT组件都不要继承它,而大部分JFace组件可以通过继承来扩展。
*********************************************************
本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/64535,如需转载请自行联系原作者