Shell 与Display的区别

来源:互联网 发布:mac最好用的杀毒软件 编辑:程序博客网 时间:2024/06/05 14:51
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   事件读取分发函数
读取操作系统的事件队列中的事件,
派遣它,并返回代码> <真正的< /代码>
如果有可能有更多的工作要做,或<代码>假< /代码>
如果调用者可以睡到另一个事件放在
事件队列。
<P>
除了检查系统事件队列,该方法还
检查是否有任何线程间的信息(通过代码> < syncexec() < /代码>创建
或<代码> asyncexec() < /代码>)正在等待被处理,如果
所以他们返回前处理。
</P >

display.sleep();
导致用户界面线程EM > < <睡眠/ EM >(即,
被放在一个国家,它不消耗CPU周期)
直到接收到一个事件或是其他唤醒。

private ActionContributionItem createActionContributionItem(IAction action){
 ActionContributionItem aci = new ActionContributionItem(action);
 aci.setMode(ActionContributionItem.MODE_FORCE_TEXT);//显示图像+文字
 return aci;
}
0 0
原创粉丝点击