Display:与操作系统沟通的桥梁
我们在前面说过,每个swt程序在最开始都必须创建一个Display对象,它所起的作用就是担当swt与操作系统沟通的一座桥梁。
Display对象主要负责swt和操作系统的通信,它将swt的各种调用转化为操作系统的底层调用,控制操作系统为swt分配的资源。
Display实际上担当着“幕后工作者”的身份,它为swt屏蔽了对操作系统图形资源的调用,但是在你创建的图形用户界面中看不到它的影子。
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.graphics.*;
class HelloSWT {
public static void main(String[] args) {
Display display=new Display();//创建一个display对象。
Shell shell=new Shell(display);//shell是程序的主窗体
shell.setLayout(null); //设置shell的布局方式
Text hello=new Text(shell,SWT.MULTI); //声明一个可以显示多行信息的文本框
shell.setText("Java应用程序"); //设置主窗体的标题
shell.setSize(200,100); //设置主窗体的大小
Color color=new Color(Display.getCurrent(),255,255,255);//声明颜色对象
shell.setBackground(color); //设置窗体的背景颜色
hello.setText("Hello, SWT World!\n\n你好,SWT世界!");//设置文本框信息
hello.pack(); //自动调整文本框的大小
//shell.pack(); //自动调整主窗体的大小
shell.open(); //打开主窗体
while(!shell.isDisposed()){ //如果主窗体没有关闭则一直循环
if(!display.readAndDispatch()){ //如果display不忙
display.sleep(); //休眠
}
}
display.dispose(); //销毁display
}
}
Shell的setSize()方法用来指定要显示的window的大小,示例代码中是宽200像素,高200像素
Shell的open()方法用来在显示设备上显示window,如果不调用open方法,会发现没有任何window显示出来,虽然这个window已经在内存中被创建了。
Shell的isDispose()方法用来判断window是否已经被关闭
Display的readAndDispath()方法用来监听并分派Shell上产生的各种事件并分发给相应的处理程序
Display的dispose()程序用来释放创建Display实例时所占用的资源
while(!shell.isDisposed()){ //如果主窗体没有关闭则一直循环
if(!display.readAndDispatch()){ //如果display不忙
display.sleep(); //休眠
}
3.Hello World
3.1Swt基础概念:
3.1.1所有的内容都要通过Display对象来输出,一般一个程序只有一个Display对象。
3.1.2窗口被称为Shell
3.2创建工程,并引用Swt工程
New-->Java Project
在新创建的工程上点右键,选Properties,修改Java Build Path:
选项卡选择Projects-->Add,勾选刚导入的swt工程,此时要保证此swt工程是打开状态的。
勾选后就可以使用swt包中的类了。
3.3创建HelloWorld类:
New-->Class
输入类名,并勾选创建main函数。
3.4创建Display和Shell
Display display = new Display();
Shell shell = new Shell(display)
3.5设置shell标题栏文本
shell.setText("Hello world!");
3.6显示窗口
shell.open()
试试执行一下,屏幕上一个窗口一闪而过,什么都没看清,这是因为shell.open执行完毕后程序退出了,窗口自然消失了。
3.7在shell.open()后加个死循环等待看看
for(;;) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
再执行一下,可以看到一个窗口出现,但是什么事件都不响应。
3.8不响应事件是因为循环中没有处理事件,将循环修改一下,改成调用Display类的事件读取分发函数,则就能响应事件了。
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
3.9当程序执行完毕时回收资源。
display.dispose();
在swt中有两个原则:
3.9.1谁创建谁dispose,就好像内存分配回收一样,display是被创建的,所以要被dispose。shell在关闭窗口时已经dispose了,所以不必再dispose。
3.9.2父组件dispose时会dispose所有子组件。
display.readAndDispatch 事件读取分发函数
读取操作系统的事件队列中的事件,
派遣它,并返回代码> <真正的< /代码>
如果有可能有更多的工作要做,或<代码>假< /代码>
如果调用者可以睡到另一个事件放在
事件队列。
除了检查系统事件队列,该方法还
检查是否有任何线程间的信息(通过代码> < syncexec() < /代码>创建
或<代码> asyncexec() < /代码>)正在等待被处理,如果
所以他们返回前处理。
display.sleep();
导致用户界面线程EM > < <睡眠/ EM >(即,
被放在一个国家,它不消耗CPU周期)
直到接收到一个事件或是其他唤醒。
private ActionContributionItem createActionContributionItem(IAction action){
ActionContributionItem aci = new ActionContributionItem(action);
aci.setMode(ActionContributionItem.MODE_FORCE_TEXT);//显示图像+文字
return aci;
}