SWT经典入门实例

时间:2024-04-07 20:42:36

13.2  SWT程序

SWT是一套独立的库,用户可以在SWT的基础上很容易地建立自己的应用,本节的目的就是要在SWT上建立一个简单的“Hello world”程序,读者可以在这个简单的程序上建立自己的应用。

13.2.1  加入SWT依赖的包

SWT为用户提供了一套API,用户如果要使用SWT进行开发,必须把所需的JAR包放在Eclipse项目的ClassPath中。在此笔者采用新建一个插件项目,插件项目会自动引用SWT相关的包,步骤如下。

(1)运行Eclipse。单击“File”→“New”→“Other”菜单项,在弹出的对话框中选择 Select 对话框左边的 Plug-in Development 向导。如图13-3所示,选择 Plug-in Project。

(2)单击“Next”按钮,弹出新建对话框,输入项目名称。此处使用了“com.free. swtjface.demo”。单击“Next”按钮后弹出新建对话框页,如图13-4所示。

 

SWT经典入门实例 

图13-3  新建插件对话框                           

 

SWT经典入门实例  

图13-4  新建项目

(3)单击“Next”按钮,在接下来的对话框中单击“Finish”按钮,建立一个空的插件项目在此项目中,Eclipse中已经自动引入了此插件所需要依赖的包,其中包括SWT/JFace所用到的包如图13-5所示。

 

SWT经典入门实例

图13-5  插件依赖的包

如果用户想加入SWT/JFace相关的包,也可以手动加入下面几个包“org.eclipse.swt.win32. win32.x86_3.1.1.jar”、“org.eclipse.swt_3.1.0.jar”和“org.eclipse.jface_3.1.1.jar”到插件的类路径中。

 

 

13.2.2 “Hello world”程序

现在SWT所依赖的包已经加入到了项目的ClassPath中,SWT程序和Java的程序一样,也是通过main函数运行的,如例程13-1所示。

例程13-1  HelloWorldSwt.java

    

package com.free.helloworld;

public class HelloWorldSwt {

public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setText("hello world! Window"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); }

}

这段程序虽然很简单,但是它反映了书写SWT程序的步骤:

(1)创建一个Display对象。Display对象是SWT和操作系统通信的桥梁。

(2)创建一个或者多个Shell对象。可以认为Shell代表了程序的窗口。

(3)在Shell内创建各种部件(widget),如按钮、下拉框和列表等。

(4)对各个部件进行初始化(外观、状态等),同时为各种部件的事件创建监听器 (listener)。监听器可以监听窗口的消息,在此没有添加监听器,将会在后面的章节重点介绍监听器的注册。

(5)调用Shell对象的open()方法以显示窗体。

(6)对各种事件进行监听并处理,直到程序发出退出消息。

(7)调用Display对象的dispose()方法以结束程序。

 提示:SWT程序的运行和例程13-1类似,读者如果不清楚SWT程序的运行机制,可以直接复制上面的样板代码就可以了。

 

13.2.3  运行SWT应用

SWT程序的运行要通过JNI调用相应的操作系统控件,运行SWT程序和运行Java应用程序有点不同,在Eclipse中用户可以选择运行SWT程序(SWT Application),步骤如下:

(1)打开Java的默认视图,在“Hello world”程序的文件上单击鼠标右键。

(2)选择“SWT Application”菜单,如图13-6所示。

SWT经典入门实例  

图13-6  运行SWT程序

(3)单击“SWT Application”菜单运行,运行效果如图13-7所示。

SWT经典入门实例 

图13-7  SWT“Hello world”程序

HelloWorldSwt程序只创建了一个窗口(shell),读者可以把shell当成其他组件的父窗口,创建其他组件。

 

 

13.3  使用Swing组件

SWT和Swing其实在概念上有很多相似的地方,它们之间最大的一个不同点是:Swing完全从跨平台的角度考虑,用Swing实现的组件完全是用Java编写的,没有用到和操作系统相关的组件。但SWT采用了更聪明的方式,如果操作系统有相关的组件,那么SWT只会采用JNI的方式调用相关的组件,如果操作系统不提供组件才会考虑用Java来创建。

 

13.3.1  添加Swing的组件

在项目开发中,如果用Swing开发了前期的工作,又不想用SWT重写这些代码,该怎么做呢?SWT提供了完美的解决方案,用户可以把用Swing编写出来的组件放在SWT的组件之上,而不需要放弃以前的代码(但可能会牺牲界面的风格和效率)。

在SWT的组件中可以添加Swing组件。SWT的组件只是作为Swing组件的一个父容器,要在SWT中加入Swing组件的步骤如下:

(1)添加SWT的组件。

(2)在SWT的组件上添加Swing的Frame。

(3)在Frame上添加其他Swing的组件。

如例程13-2展示了如何在SWT中添加Swing的Table组件。

例程13-2  SwingTableInSwt.java

  public class SwingTableInSwt {

public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout());

//新建SWT组件 Composite composite = new Composite(shell, SWT.NO_BACKGROUND | SWT.EMBEDDED);

try { System.setProperty("sun.awt.noerasebackground", "true"); } catch (NoSuchMethodError error) { }

//在SWT组件上新建一个Frame容器 Frame frame = SWT_AWT.new_Frame(composite); Panel panel = new Panel(new BorderLayout()) { public void update(java.awt.Graphics g) { paint(g); } }; //在容器中添加子容器 frame.add(panel); JRootPane root = new JRootPane(); panel.add(root); java.awt.Container contentPane = root.getContentPane();

int nrows = 1000, ncolumns = 10; Vector rows = new Vector(); for (int i = 0; i < nrows; i++) { Vector row = new Vector(); for (int j = 0; j < ncolumns; j++) { row.addElement("Item " + i + "-" + j); } rows.addElement(row); } Vector columns = new Vector(); for (int i = 0; i < ncolumns; i++) { columns.addElement("Column " + i); } JTable table = new JTable(rows, columns); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.createDefaultColumnsFromModel(); JScrollPane scrollPane = new JScrollPane(table); contentPane.setLayout(new BorderLayout()); //添加相应的组件 contentPane.add(scrollPane);

shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }

}

按照添加Swing组件的步骤,创建了Composite作为安置Swing组件的窗口,JTable为一个Swing的组件,而通过“Frame frame = SWT_AWT.new_Frame(composite);”创建的frame为SWT和Swing创建了桥梁。

13.3.2  程序运行效果

在上例中,SWT组件添加了一个Swing的JTable组件,程序运行效果如图13-8所示

SWT经典入门实例  

图13-8  SWT组件上加入Swing的组件

要把基于Swing的产品移植到Eclipse中,为了最大限度地减少工作量,通常会用到通过SWT组件集成Swing的组件,虽然显示的界面会有一些不协调,但也已大大减少重新开发的时间。