可以使用标准窗口小部件工具箱(standard widget toolkit,swt)和 jface 库来开发用于 eclipse 环境的图形用户界面,而且还可以将它们用于开发单独的 gui 本机应用程序。在本文中,我将介绍一些基本的 swt(基本 gui 对象的名称)类型,并展示如何综合使用它们来创建有用的应用程序。



  基本控件
  几乎所有 swt gui 都是从某些基础部分开始创建的。所有 swt 窗口小部件都可以在 org.eclipse.swt.widget 或 org.eclipse.swt.custom 包中找到。(一些 eclipse 插件还在其他包中提供了定制的窗口小部件。)窗口小部件包中包含一些基于操作系统控件的控件,而定制包中则包含一些超出操作系统控件集之外的控件。一些定制的软件包控件类似于窗口小部件包中的控件。为了避免命名冲突,定制控件的名称都是以“c”开始的(例如,比较 clabel 与 label)。 
  在 swt 中,所有控件(除了一些高级控件,比如 shell,将在后面进行讨论)在创建的时候都必须有一个父控件(一个复合实例)。在创建的时候,这些控件被自动“添加”到父控件中,这与必须明确添加到父控件中的 awt/swing 中的控件有所不同,自动添加产生了一种“自上而下”地构造 gui 的方法。这样,所有控件都可以采用一个复合父控件(或者一个子类)作为构造函数的参数。
  大多数控件都有一些必须在创建时设置的标记选项。因此,大多数控件还有另外一个构造函数参数,我们通常称之为样式,该参数提供了设置这些选项的标记。所有这些参数值都是 static final int,并且都是在 org.eclipse.swt 包的 swt 类中定义的。如果不需要任何参数,则可以使用 swt.none 值。 
  标签
  标签可能是最简单的控件,标签 被用于显示纯文本(没有颜色、特殊字体或样式的文本)或称为图标的小图像。标签不接受焦点(换句话说,用户不能通过 tab 键或鼠标移动到标签),因此,标签无法产生输入事件。
  清单 1 展示了如何创建一个简单的文本标签。
  清单 1. 创建一个带文本的标签
 import org.eclipse.swt.widget.*;  : composite parent = ...;  : // create a center aligned label label label = new label(parent, swt.center);   label.settext("this is the label text");  import com.eclipse.swt.graphics.*; import org.eclipse.swt.widget.*; import org.eclipse.swt.custom.*;  : composite parent = ...; image image = ...;  : // create a left aligned label with an icon clabel clabel = new clabel(parent, swt.left);   label.settext("this is the imaged label text""); label.setimage(image);  import org.eclipse.swt.widget.*;  : composite parent = ...;  : // create a text field text name = new text(parent, swt.single);   name.settext("<none>"); name.settextlimit(50); name.settooltiptext("enter your name -- last, first");  name.selectall();  // enable fast erase   清单 4 创建了一个“clear”按钮:  
  清单 4. 创建一个按钮
 import org.eclipse.swt.widget.*;  : composite parent = ...;  : // create a push button button clear = new button(parent, swt.push);   clear.settext("clea&r"); & 导致利用紧接着的一个字母创建一个加速器,允许通过 ctrl+<字母> 顺序的方式按下按钮(控件顺序由主机操作系统决定)。 selectionlistener(在 org.eclipse.swt.events 包中)做到这一点。当按钮状态发生改变时(通常是按钮被按下),就会生成事件。清单 5 在单击 clear 按钮时输出一条消息。   import org.eclipse.swt.events.*;  : // clear button pressed event handler clear.addselectionlistener(new selectionlistener() {      public void widgetelected(selectionevent e) {         system.out.println("clear pressed!");        }     public void widgetdefaultselected(selectionevent e) {         widgetelected(e);     } }); ...listener 类还有一个类似的 ...adapter 类,这个类提供了一些空的方法实现,并且可以减少您需要编写的代码数量。例如,还有一个 selectionadapter 类,这个类实现了 selectionlistener。   复合控件
  至此,我们已经讨论了一些单独的控件。在多数 gui 中,许多控件被组合在一起以提供丰富的用户体验。在 swt 中,这种组合是通过 composite 类实现的。 
  复合控件可以在任何级别上进行嵌套,并且可以混合和匹配控件,将它们作为子控件进行组合。这样做可以极大地减少 gui 开发的复杂性,并为 gui 代码重用(通过封装内部 gui)创造了机会。复合控件可以是有边界的,并且这些边界很容易在视觉上产生混淆,或者它们也可以是无边界的,无缝集成到更大的组中。 
  清单 6. 创建一个有边界的复合控件。
  单 6. 创建一个有边界的复合控件
 import org.eclipse.swt.widget.*;  : composite parent = ...;  : composite border = new composite(parent, swt.border);  import org.eclipse.swt.widget.*;  : composite parent = ...;  : group border = new group(parent, swt.shadow_out); border.settext("group description"); swt.shell_trim 或 swt.dialog_trim。shell 可以是模态的,也可以是非模态的。模态 shell 常常用于对话框,防止父 gui(如果有的话)在关闭子 shell 之前被处理。  import org.eclipse.swt.widget.*;  : shell frame = new shell(swt.shell_trim);  :  : shell dialog = new shell(frame, swt.dialog_trim);  : 

  在多数情况下,应该选择使用 layoutmanagers,因为很容易调整它们来适应可变大小的 gui。swt 也提供了一些布局管理器供您使用;在这一期的系列文章中,我们将讨论两种基本的布局管理器:filllayout 和 gridlayout。在这两种情况下,每当重新设置复合控件的大小,都需要进行定位。 
  一些布局管理器常常是专为某一个复合控件分配的。一些布局管理器只使用它们自身的参数就可以控制,而另一些布局管理器还需要其他参数 —— layoutdata,该参数是在它们管理的复合控件中的每个控件上指定的。 
  filllayout
  filllayout 以行或列的形式安排控件。每个控件所设置的大小将与填充该复合控件所需的宽度和高度相同,在这些控件之间,空间是平均分配的。一种特殊情况是:在仅有一个子控件时,该控件的大小被设置为填充整个父复合控件的大小。
  清单 10. 使用 filllayout 创建一列控件
 import org.eclipse.swt.widget.*; import org.eclipse.swt.layouts.*;  : composite composite = ...; filllayout filllayout = new filllayout(swt.vertical); composite.setlayout(filllayout);  import org.eclipse.swt.widget.*; import org.eclipse.swt.layouts.*;  : composite composite = ...; gridlayout gridlayout = new gridlayout(2, false); composite.setlayout(gridlayout); label l1 = new label(composite, swt.left); l1.settext("first name: "); text first = new text(composite, swt.single); label l1 = new label(composite, swt.left); l2.settext("last name: "); text last = new text(composite, swt.single); first.setlayoutdata(new griddata(swt.fill, swt.fill, true, true)); last.setlayoutdata(new griddata(swt.fill, swt.fill, true, true));  import org.eclipse.swt.widget.*;  : display display = new display(); shell shell = new shell(display); shell.settext("shell title"); // *** construct shell children here *** shell.open();       // open shell for user access // process all user input events while(!shell.isdisposed()) {    // process the next event, wait when none available    if(!display.readanddispatch()) {        display.sleep();    } } display.dispose();  // must always clean up 
新闻热点
疑难解答