SWT学习笔记!
1,SWT/JFace 与AWT/SWING 区别是?
java的标准图形 API : AWT/SWING 一直是被后人诟病的, 用它写的页面不够完美, 页面响应速度还慢。后来出现的Eclipse 的SWT/JFace 图形 API 彻底改变了这一状况。主要原因是: SWT/JFace 与AWT/SWING 在实现上有很大的不同, AWT/SWING 是模拟本机窗口组件, 而 SWT/JFace 则是直接调用本机窗口组件,当本机没有所需组件时才进行模拟。
2,SWT/JFace 的缺点是?
它没有java的跨平台的特性,每个OS要用eclipse,都需要重新移植一次SWT/JFace ,这也是SWT/JFace 最具争议的地方。不过因为SWT/JFace 已经移植到了几个主流的OS上了,所以这已经不再是什么严重的问题了。
3,eclipse可以用来开发JAVA、C、C++等
eclipse有极为强大的集成开发环境,它集成了CVS, JUnit, Ant, 并且强大的代码重构功能独步江湖、无人能及。eclipse的安装包集成了java开发环境的插件、JDT、所以、它是默认的java开发工具、但它不仅对java开发、给它装上C/C++的插件、就用可以用开发C、C++了。
4、eclipse常用插件的安装、以及下载地址。
eclipse的插件安装其实很简单、只需要将安装的插件包拷贝到eclipse下面的plugins就ok了。
SWT Designer 是一个很好的eclipse的SWT 界面开发插件包、SWT Designer支持、界面组件拖拉操作
官方网站地址: http://www.swt-designer.com
MyEclipse:j2ee开发插件、支持jsp、ejb、数据库操作。官方网站地址:http://www.myeclipseide.com/
lomboz: 是和MyEclipse 同类型的插件、不过 MyEclipse 是收费的、 lomboz免费 这样的插件有很多、这里就不详细介绍了。
5, SWT/JFace的简单介绍!
SWT/JFace 有多强大,看看eclipse3.0(and以后版本),就可以清楚的知道了。 首先, JFace是为了方便开发SWT程序,在SWT基础上创建的一个更易用,功能强大的图形包。然而, JFace并不能完全覆盖SWT的所有功能,所以,编程时,JFace和SWT都会被用到,但是一般来说能用JFace组件,就最好不要用SWT的。
6, SWT中的包!
①org.eclipse.swt.widgets
最常用的组件基本都在这个包里,如:button,text,label,combo等,其中两个最重要的组件当数,shell 和 composite;shell相当于应用程序的主窗口,composite,相当于SWING中的panel对象,时容纳组件的容器。
②org.eclipse.swt.layout
主要的界面布局方式在该包中。SWT对组件的布局也采用了AWT/SWING中的Layout 和 Layout Data 结合的方式
③org.eclipse.swt.custom
对一些基本图形组件的扩展在该包中。例如:其中的CLabel就是对标准Label组件的扩展,在CLabel上可以同时加入文字和图片。在该包中还有一个新的布局方式StackLayout。
④org.eclipse.swt.event
SWT采用和AWT/SWING一样的时间模型,在包中,可以找到事件监听类和相应的事件对象。例如:鼠标事件监听器MouseListener,MouseMoveListener等,以及对应的事件对象MouseEvent。
⑤org.eclipse.swt.graphics
该包中,包含针对图片,光标,字体和绘图API。例如:可通过IMAGE类来调用系统中不同类型的图片。
⑥org.eclipse.swt.ole.win32
对不同平台,SWT有一些针对性的API。例如,在Windows平台,可以通过该包很容易的调用ole组件,这使得SWT程序也可以内嵌IE浏览器或Word,Excel等程序。
eclipse学习笔记!(2) ----- SWT Designer 概述收藏
SWT Designer是优秀的SWT/JFace开发辅助工具, 以下通过写一个Hello World的小程序来简单了解下SWT!
首先从官方网站下载http://www.swt-designer.com,之后,把对应的文件拷贝到Eclipse目录下,这时,在Eclipse的windows的首选项里面,就可以看到designer了,点击注册,通过注册机完成注册!
然后新建项目时候,选择designer下面的 SWT/JFace java project , 项目名字右键 new other ... designer... Swt...Application Window 选项新建一个第3项 main 主函数的类, 然后就可以运行这个类了。生成的代码如下:
package src;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class HelloWorld ...{
/** *//**
* Launch the application
* @param args
*/
public static void main(String[] args) ...{
//display负责管理事件循环和控制UI线程和其他线程之间的通信
final Display display = Display.getDefault();
final Shell shell = new Shell(); //SHELL是程序的主窗口
shell.setSize(500, 375); //主窗口大小
shell.setText("SWT Application");//主窗口标题
//
shell.open();
shell.layout();
while (!shell.isDisposed()) ...{ //如果,主窗口没有关闭,则一直循环
if (!display.readAndDispatch())//如果DISPLAY不忙
display.sleep(); //DISPLAY休眠
}
}
}
从这个代码可以看到,创建一个典型的SWT应用程序需要以下的步骤:
· 创建一个Display
· 创建一个或多个Shell
· 设置SHELL的布局
· 创建Shell中的组件(以上代码中没有组件,只有一个主窗口,run时候就可以看到一个空的窗口)
· 用open()方法打开Shell窗口
· 写一个事件转发循环
· 销毁Display。
下面,进行窗口中组件的添加, 首先, 把视图切换到designer项,选择SWT Controls分类下的text 组件,放入窗口中,然后对这个组件的属性设置中的 text 设置为 HelloWorld 。 (其他的属性都可以根据自己的情况来设定) 但是 SWT Designer 还无法完成所有的界面设计工作,所以,界面开发中,仍然是以代码设计为主的, 另外 SWT Designer 还不是狠稳定, 界面加入太多的组件, 或频繁的添加删除组件,都有可能造成内存耗尽而死机。
eclipse学习笔记!(3) ----- SWT Designer 下 SWT/JFace 事件的四种写法以及常用的事件收藏
SWT/JFace 事件的四种写法
SWT 的事件模型和 JAVA 标准的 AWT 基本一样的。下面将按照,事件的四种写法来实现它。下面的代码都是和上一个学习笔记里的小例子变化来的。
· 匿名内部类写法
在原来代码行"HelloWorldText = new Text(shell, SWT.BORDER);"下面插入如下的代码:
HelloWorldText.addMouseListener(new MouseAdapter()...{
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello world");
}
});
new MouseAdapter(); 就是一个匿名内部类。我们建立了一个继承于MouseAdapter的类,但并没有给这个类命名,并且没有用通常的写法,而是直接在HelloWorldText.addMouseListener()中,写下了这个类的代码,这就是所谓的匿名内部类。
缺点:
1. 由于事件处理,代码会随着组件一起分散到代码中的各个部分,不集中,导致阅读和维护的不便。
2. 各事件的处理全部由嵌套的程序块组成,视觉上很乱,如果事件处理代码很长,也会导致阅读和维护不便。
3. 当菜单栏,工具栏等也需要处理相同的用户行为时,无法重用事件中的处理代码,导致代码不够简洁。
· 命名内部类写法
事件代码使用命名内部类的方式,可以解决匿名内部类的存在的问题, 首先,事件处理代码都集中在一起,并具有有意义的名字,程序容易阅读和维护;另外单个事件的处理程序也可以被工具栏,菜单栏等重用。代码如下:
public class HelloWorld ...{
private static Text HelloWorldText;
public static void main(String[] args) ...{
... ...
HelloWorldText = new Text(shell, SWT.BORDER);
HelloWorldText.addMouseListener(new MyMouseDoubleClick());//引用定义的类
... ...
}
// 定义一个匿名内部类
private static final class MyMouseDoubleClick extends MouseAdapter...{
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello ... ai wo , ni shi wo de !!!");
}
}
}
· 外部类写法
这种写法和命名内部类有些相似,只不过是将MyMouseDoubleClick类从HelloWorld.java 中拿出去,单独写成一个类文件。代码和命名内部类的相同,我就不重复了。
· 实现监听接口的写法
将HelloWorld 类实现 MouseListener 接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更加的简洁,这种方式适合加入监听器的组件较多,并且要求监听器的事件处理代码可以被组件共用。
实现MouseListener接口要写的事件方法多一些,没有用到的可以为空实现。如果继承MouseListener 接口的适配器MouseAdapter, 则只写需要的方法就可以了。另外需要注意的是,只有接口才有多继承的特性,所以,如果HelloWorld已经是某个类的子类了,就只能用实现接口的方式,而不能继承接口的适配器了。代码如下:
public class HelloWorld implements MouseListener...{ // or extends MouseAdapter
public static void main(String[] args) ...{
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application");
shell.open();
Text HelloWorldText = new Text(shell, SWT.BORDER);
HelloWorldText.addMouseListener(new HelloWorld());
HelloWorldText.setText("HelloWorld");
HelloWorldText.setBounds(52, 68, 349, 29);
shell.layout();
while (!shell.isDisposed()) ...{
if (!display.readAndDispatch())
display.sleep();
}
}
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello ... ai wo de re !!");
}
//if extends MouseAdapter , delete the follow methods
public void mouseDown(MouseEvent e) ...{
}
public void mouseUp(MouseEvent e) ...{
}
}
SWT/JFace 中常用的事件
除了,上面用到的addMouseListener, Eclipse 还有一些常用的监听器,它们在各组件里的使用方法相同(如果该组件支持此种事件),简单介绍如下:
· addSelectionListener: 这个监听最常用。
widgetSelected 方法:当组件被选择(单击鼠标或按回车键)时触发此方法的事件处理程序。
widgetDefaultSelected 方法: 用于某些很少触发选择事件的组件,例如:文本框回车事件,列表框双击事件等。
· addKeyListener:
keyPressed 方法:当前焦点停留在组件时,按下键盘任意键时触发,但对于某些组件(如:button),按回车键无法执行此方法。
keyReleased方法: 按键弹起时触发。
· addFocusListener
focusGained方法: 得到焦点时触发。
focusLost方法: 失去焦点时触发。
eclipse学习笔记!(4) ----- SWT Designer 下 SWT常用组件收藏
· 一个button类的实例
基本的步骤和之前的是一样的,一个SWT的项目,然后在页面设置面板里添加button。双击button(直接在source里面添加了监听器的代码)。下面是代码:
public class ButtonTest ...{
public static void main(String[] args) ...{
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application");
shell.open();
final Button okButton = new Button(shell, SWT.NONE);
//因为是比较简单的例子,只在这一个地方用这个的原因,所以用匿名方式
okButton.addMouseListener(new MouseAdapter() ...{
public void mouseUp(MouseEvent e) ...{
MessageDialog.openInformation(null,"","you click the "+ okButton.getText() +"button");
}
});
okButton.setText("OK.");
okButton.setBounds(97, 196, 244, 54);
shell.layout();
while (!shell.isDisposed()) ...{
if (!display.readAndDispatch())
display.sleep();
}
}
}
程序说明: Button类的构造方法是new Button(Composite parent,int style),它有2