SWT中还有一些常用的组件
它们可以使组件更有表现力
且称之为展现组件
它们在SWT开发中也是不可缺少的
包括菜单组件
工具栏组件ToolBar和ToolItem
工具栏组件CoolBar和CoolItem
滚动组件Slider
刻度组件Scale和进度条组件ProgressBar等
菜单组件
在程序中菜单是提供信息比较好的方式SWT中通过Menu和MenuItem实现菜单和菜单项在程序中添加菜单的步骤如下
()创建Menu对象并指定创建的样式例如menuBar = new Menu(shell SWTBAR);
()创建MenuItem对象并指定创建样式例如fileEnglishItem = new MenuItem (fileMenu SWTRADIO);
()设置Menu和MenuItem的关联(Menu中还可以有子Menu)例如fileMenuHeader setMenu(fileMenu);
()添加MenuItem的事件监听器例如fileEnglishItemaddSelectionListener(new RadioItemListener());
为了更好地掌握菜单下面通过一个实例演示如何创建菜单代码如例程所示
例程 MenuExamplejava
/*** 为了节省篇幅所有的import类已经被注释* 读者可以通过ctrl+shift+o快捷键自动引入所依赖的类* 如果有问题可发邮件到* */public class MenuExample {Display display;Shell shell;Menu menuBar fileMenu editMenu;MenuItem fileMenuHeader editMenuHeader;MenuItem fileExitItem fileSaveItem fileEnglishItem fileGermanItemeditCopyItem;Text text;public MenuExample() {display = new Display();shell = new Shell(display);shellsetText(Menu Example);shellsetSize( );text = new Text(shell SWTBORDER);textsetBounds( );//添加主菜单项 menuBar = new Menu(shell SWTBAR);//添加一级子菜单 fileMenuHeader = new MenuItem(menuBar SWTCASCADE);fileMenuHeadersetText(&File);//添加一级子菜单的菜单项 fileMenu = new Menu(shell SWTDROP_DOWN);fileMenuHeadersetMenu(fileMenu);fileSaveItem = new MenuItem(fileMenu SWTPUSH);fileSaveItemsetText(&Save);fileEnglishItem = new MenuItem(fileMenu SWTRADIO);fileEnglishItemsetText(English);fileGermanItem = new MenuItem(fileMenu SWTRADIO);fileGermanItemsetText(German);fileExitItem = new MenuItem(fileMenu SWTPUSH);fileExitItemsetText(E&xit);editMenuHeader = new MenuItem(menuBar SWTCASCADE);editMenuHeadersetText(&Edit);editMenu = new Menu(shell SWTDROP_DOWN);editMenuHeadersetMenu(editMenu);editCopyItem = new MenuItem(editMenu SWTPUSH);editCopyItemsetText(&Copy);//添加菜单项的事件监听器 fileExitItemaddSelectionListener(new MenuItemListener());fileSaveItemaddSelectionListener(new MenuItemListener());editCopyItemaddSelectionListener(new MenuItemListener());fileEnglishItemaddSelectionListener(new RadioItemListener());fileGermanItemaddSelectionListener(new RadioItemListener());shellsetMenuBar(menuBar);shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch())displaysleep();}displaydispose();}class MenuItemListener extends SelectionAdapter {public void widgetSelected(SelectionEvent event) {textsetText(You selected + ((MenuItem) eventwidget)getText());if (((MenuItem) eventwidget)getText()equals(E&xit)) {shellclose();}}}class RadioItemListener extends SelectionAdapter {public void widgetSelected(SelectionEvent event) {MenuItem item = (MenuItem) eventwidget;textsetText(itemgetText() + is on);}}public static void main(String[] args) {MenuExample menuExample = new MenuExample();}}
以上程序中添加了主菜单并在主菜单中添加了两个子菜单项子菜单项添加了相应的事件响应机制程序运行效果如图所示
图 Menu\MenuItem组件
菜单是可以级联的在子菜单中还能够包含其它的菜单项
工具栏组件ToolBar和ToolItem
ToolBar是SWT中的工具栏组件ToolItem是工具栏中的工具项(一般表现为按钮或分隔符也可以是其他组件)在程序中添加工具栏的步骤如下
创建ToolBar对象并指定创建的样式例如toolBar = new ToolBar(shell SWTFLAT | SWTWRAP | SWTRIGHT);
创建ToolItem对象并指定创建样式例如ToolItem itemPush = new ToolItem (toolBar SWTPUSH);
设置ToolItem的图标和相关属性例如itemPushsetImage(icon);
添加ToolItem的事件监听器例如itemPushaddListener(SWTSelectionselectionListener);
为了更好地掌握工具栏组件下面通过一个实例演示如何创建工具栏组件代码如例程所示
例程 ToolBarExamplejava
public class ToolBarExample {Display display = new Display();Shell shell = new Shell(display);ToolBar toolBar;public ToolBarExample() {//添加工具栏 toolBar = new ToolBar(shell SWTFLAT | SWTWRAP | SWTRIGHT);//添加工具项 ToolItem itemPush = new ToolItem(toolBar SWTPUSH);itemPushsetText(PUSH item);//设置工具项的显示图标//Image icon = new Image(shellgetDisplay() icons/newgif);//itemPushsetImage(icon); ToolItem itemCheck = new ToolItem(toolBar SWTCHECK);itemChecksetText(CHECK item);ToolItem itemRadio = new ToolItem(toolBar SWTRADIO);itemRadiosetText(RADIO item );ToolItem itemRadio = new ToolItem(toolBar SWTRADIO);itemRadiosetText(RADIO item );ToolItem itemSeparator = new ToolItem(toolBar SWTSEPARATOR);final ToolItem itemDropDown = new ToolItem(toolBar SWTDROP_DOWN);itemDropDownsetText(DROP_DOWN item);itemDropDownsetToolTipText(Click here to see a drop down menu );final Menu menu = new Menu(shell SWTPOP_UP);new MenuItem(menu SWTPUSH)setText(Menu item );new MenuItem(menu SWTPUSH)setText(Menu item );new MenuItem(menu SWTSEPARATOR);new MenuItem(menu SWTPUSH)setText(Menu item );//设置工具项的事件监听器 itemDropDownaddListener(SWTSelection new Listener() {public void handleEvent(Event event) {if (eventdetail == SWTARROW) {Rectangle bounds = itemDropDowngetBounds();Point point = toolBartoDisplay(boundsx boundsy+ boundsheight);//设置菜单的显示位置 menusetLocation(point);menusetVisible(true);}}});//设置工具项的事件监听器 Listener selectionListener = new Listener() {public void handleEvent(Event event) {ToolItem item = (ToolItem) eventwidget;Systemoutprintln(itemgetText() + is selected);if ((itemgetStyle() & SWTRADIO) != || (itemgetStyle() & SWTCHECK) != )Systemoutprintln(Selection status: + itemgetSelection());}};itemPushaddListener(SWTSelection selectionListener);itemCheckaddListener(SWTSelection selectionListener);itemRadioaddListener(SWTSelection selectionListener);itemRadioaddListener(SWTSelection selectionListener);itemDropDownaddListener(SWTSelection selectionListener);toolBarpack();shelladdListener(SWTResize new Listener() {public void handleEvent(Event event) {Rectangle clientArea = shellgetClientArea();toolBarsetSize(puteSize(clientAreawidthSWTDEFAULT));}});shellsetSize( );shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch()) {displaysleep();}}displaydispose();}public static void main(String[] args) {new ToolBarExample();}}
程序添加了工具栏并在工具栏中添加了相应的工具项工具项中添加了相应的事件响应机制程序运行效果如图所示
图 工具栏组件
本示例显示了工具栏和菜单栏的配合使用菜单动态设定显示的位置
工具栏组件CoolBar和CoolItem
CoolBar是另外一种形式的工具栏它能够调整CoolItem的位置每一个CoolItem可以设定相关的组件(也可以是另一个工具栏)创建CoolBar的步骤如下
创建CoolBar对象并指定创建的样式例如CoolBar composite = new CoolBar (parent SWTNONE);
创建CoolItem对象并指定创建样式例如CoolItem item = new CoolItem(composite SWTNONE);
设置CoolItem的Control对象例如itemsetControl(tb);
CoolBar相当于一个面板容器CoolItem是容器中的每一项CoolItem能设置相应的组件作为此项的子容器(也可以是其他组件)为了更好地掌握CoolBar组件下面通过一个实例演示如何创建CoolBar组件代码如例程所示
例程 CoolBarExamplejava
public class CoolBarExample extends ApplicationWindow {public CoolBarExample() {super(null);}protected Control createContents(Composite parent) {getShell()setText(CoolBar Test);String asCoolItemSection[] = { File Formatting Search };//添加CoolBar CoolBar composite = new CoolBar(parent SWTNONE);for (int idxCoolItem = ; idxCoolItem < ; ++idxCoolItem) {CoolItem item = new CoolItem(composite SWTNONE);//添加子组件 ToolBar tb = new ToolBar(composite SWTFLAT);for (int idxItem = ; idxItem < ; ++idxItem) {ToolItem ti = new ToolItem(tb SWTNONE);tisetText(asCoolItemSection[idxCoolItem] + Item #+ idxItem);}Point p = puteSize(SWTDEFAULT SWTDEFAULT);tbsetSize(p);Point p = puteSize(px py);//设置为一个CoolItem的控制类 itemsetControl(tb);itemsetSize(p);}return composite;}public static void main(String[] args) {CoolBarExample app = new CoolBarExample();appsetBlockOnOpen(true);appopen();DisplaygetCurrent()dispose();}}
以上代码演示了如何创建CoolBarCoolBar中每一个CoolItem可以根据用户的需要调整位置程序运行效果如图所示
图 CoolBar组件
CoolBar和ToolBar的展现样式不一样CoolBar可以动态调整工具栏的位置
滚动组件Slider
为了方便用户输入数据SWT中提供了Slider组件用户可通过Slider设置数据的增量值用来控制其他组件也可以作为滚动条控制其他组件中的数据显示添加Slider组件的步骤如下
创建Slider对象并指定创建的样式例如Slider slide = new Slider(shell SWTHORIZONTAL);
设置Slider的最大值和最小值例如slidesetMaximum();
设置Slider增量的增加或递减值例如slidesetIncrement();
添加Slider的事件监听器例如slideaddSelectionListener(selectionListener);
为了更好地掌握Slider组件下面通过一个实例演示如何创建Slider组件代码如例程所示
例程 SliderExamplejava
public class SliderExample {Display dispaly;Shell shell;SliderExample() {dispaly = new Display();shell = new Shell(dispaly);shellsetSize( );shellsetText(A Slider Example);//添加Slider对象 final Slider slide = new Slider(shell SWTV_SCROLL);//设置Slider的位置和大小 slidesetBounds( );//设置Slider的最小值 slidesetMinimum();//设置Slider的最大值 slidesetMaximum();//设置Slider单击左右箭头的增加或递减值 slidesetIncrement();final Text t = new Text(shell SWTBORDER);tsetBounds( );tsetText();tsetFocus();//添加Slider的事件监听器 slideaddSelectionListener(new SelectionAdapter() {public void widgetSelected(SelectionEvent e) {tsetText(new Integer(slidegetSelection())toString());}});shellopen();while (!shellisDisposed()) {if (!dispalyreadAndDispatch())dispalysleep();}dispalydispose();}public static void main(String[] args) {new SliderExample();}}
以上代码添加了一个Text组件和一个Slider组件Slider组件设置了增量值为另外Slider组件添加了选择事件当选择了Slider组件后Slider将为Text组件赋值程序运行效果如图所示
图 Slider组件
Slider组件要配合其它的组件使用辅助其它的组件完成功能
刻度组件Scale
Scale和Slider类似在SWT中都表示一种尺度但两者的表现形式不一样Scale更像一个刻度而Slider则是提供一个滚动条添加Scale组件的步骤如下
创建Scale对象并指定创建的样式例如Scale scale = new Scale(shell SWTVERTICAL);
设置Scale的最大值和最小值例如scalesetMaximum();
设置Scale增量的增加或递减值例如scalesetPageIncrement();
添加Scale的事件监听器例如scaleaddSelectionListener(selectionListener);
为了更好地掌握Scale组件下面通过一个实例演示如何创建Scale组件代码如例程所示
例程 ScaleExamplejava
public class ScaleExample {Display display = new Display();Shell shell = new Shell(display);Scale scale;Text value;public ScaleExample() {shellsetLayout(new GridLayout( true));Label label = new Label(shell SWTNULL);labelsetText(Volume:);//添加Scale组件 scale = new Scale(shell SWTVERTICAL);scalesetBounds( );//设置Scale的最大值 scalesetMaximum();//设置Scale的最小值 scalesetMinimum();//设置Scale的增量值 scalesetPageIncrement();//添加Scale的事件监听器 scaleaddListener(SWTSelection new Listener() {public void handleEvent(Event event) {int perspectiveValue = scalegetMaximum() scalegetSelection() +scalegetMinimum();valuesetText(Vol: + perspectiveValue);}});value = new Text(shell SWTBORDER | SWTSINGLE);valuesetEditable(false);scalesetLayoutData(new GridData(GridDataHORIZONTAL_ALIGN_CENTER));valuesetLayoutData(new GridData(GridDataHORIZONTAL_ALIGN_CENTER));shellpack();shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch()) {displaysleep();}}displaydispose();}private void init() {}public static void main(String[] args) {new ScaleExample();}}
上例中通过事件监听器监听当前选择的刻度并用Text组件显示出来程序运行效果如图所示
图 Scale组件
Scale组件能够精确的显示刻度用户可以设制好刻度的范围这是非常有用的
进度条组件ProgressBar
ProgressBar是SWT中的进度条组件进度条提供了比较长时间操作的进度信息添加ProgressBar组件的步骤如下
创建ProgressBar对象并指定创建的样式例如ProgressBar pb = new ProgressBar (shell SWTHORIZONTAL | SWTSMOOTH);
设置ProgressBar的最大值和最小值例如pbsetMaximum();
在长时间的任务中设置当前进度条的进度例如progressBarsetSelection (progressBargetSelection() + );
进度条能反映当前的工作进度为了配合处理长时间的任务进度条经常配合线程使用以免产生阻塞影响界面的操作为了更好地掌握ProgressBar组件下面通过一个实例演示如何创建ProgressBar组件代码如例程所示
例程 ProgressBarExamplejava
public class ProgressBarExample {public static void main(String[] args) {Display display = new Display();Shell shell = new Shell(display);shellsetLayout(new GridLayout());//添加平滑的进度条 ProgressBar pb = new ProgressBar(shell SWTHORIZONTAL | SWTSMOOTH);pbsetLayoutData(new GridData(GridDataFILL_HORIZONTAL));//设置进度条的最小值 pbsetMinimum();//设置进度条的最大值 pbsetMaximum();//添加自动递增的进度条 ProgressBar pb = new ProgressBar(shell SWTHORIZONTAL |SWTINDETERMINATE);pbsetLayoutData(new GridData(GridDataFILL_HORIZONTAL));//添加线程在线程中处理长时间的任务并最终反映在平滑进度条上 new LongRunningOperation(display pb)start();shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch()) {displaysleep();}}}}class LongRunningOperation extends Thread {private Display display;private ProgressBar progressBar;public LongRunningOperation(Display display ProgressBar progressBar) {thisdisplay = display;thisprogressBar = progressBar;}public void run() {//模仿长时间的任务 for (int i = ; i < ; i++) {try {Threadsleep();} catch (InterruptedException e) {}displayasyncExec(new Runnable() {public void run() {if (progressBarisDisposed()) return;//进度条递增 progressBarsetSelection(progressBargetSelection() + );}});}}}
以上代码添加了两个进度条一个进度条为自动显示增加进度的信息(SWTINDETERMINAT样式)另外一个进度条通过线程处理长时间的任务并设定进度条的信息程序运行效果如图所示
图 ProgressBar组件
进度条有不同的样式在程序中开发人员可以控制进度条的进度执行某些长时间的操作