【IT168专稿】SWT中还有一些常用的组件,它们可以使组件更有表现力,且称之为展现组件,它们在SWT开
发中也是不可缺少的,包括菜单组件、工具栏组件ToolBar和ToolItem、工具栏组件CoolBar和CoolItem、滚动组件Slider、
刻度组件Scale和进度条组件ProgressBar等。
菜单组件 在程序中,菜单是提供信息比较好的方式,SWT中通过Menu和MenuItem实现菜单和菜单项,在程序中添加菜单的步骤如下。 (1)创建Menu对象,并指定创建的样式,例如“menuBar=newMenu(shell,SWT.BAR);”。 (2)创建MenuItem对象,并指定创建样式,例如“fileEnglishItem=newMenuItem(fileMenu,SWT.RADIO);”。 (3)设置Menu和MenuItem的关联(Menu中还可以有子Menu),例如“fileMenuHeader.setMenu(fileMenu);”。 (4)添加MenuItem的事件监听器,例如“fileEnglishItem.addSelectionListener(newRadioItemListener());”。 为了更好地掌握菜单,下面通过一个实例演示如何创建菜单,代码如例程1所示。 例程1MenuExample.java /** *为了节省篇幅,所有的import类已经被注释 *读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类 *如果有问题可发邮件到ganshm@gmail.com **/ publicclassMenuExample{ Displaydisplay; Shellshell; MenumenuBar,fileMenu,editMenu; MenuItemfileMenuHeader,editMenuHeader; MenuItemfileExitItem,fileSaveItem,fileEnglishItem,fileGermanItem, editCopyItem; Texttext; publicMenuExample(){ display=newDisplay(); shell=newShell(display); shell.setText("MenuExample"); shell.setSize(300,200); text=newText(shell,SWT.BORDER); text.setBounds(80,50,150,25); //添加主菜单项 menuBar=newMenu(shell,SWT.BAR); //添加一级子菜单 fileMenuHeader=newMenuItem(menuBar,SWT.CASCADE); fileMenuHeader.setText("&File"); //添加一级子菜单的菜单项 fileMenu=newMenu(shell,SWT.DROP_DOWN); fileMenuHeader.setMenu(fileMenu); fileSaveItem=newMenuItem(fileMenu,SWT.PUSH); fileSaveItem.setText("&Save"); fileEnglishItem=newMenuItem(fileMenu,SWT.RADIO); fileEnglishItem.setText("English"); fileGermanItem=newMenuItem(fileMenu,SWT.RADIO); fileGermanItem.setText("German"); fileExitItem=newMenuItem(fileMenu,SWT.PUSH); fileExitItem.setText("E&xit"); editMenuHeader=newMenuItem(menuBar,SWT.CASCADE); editMenuHeader.setText("&Edit"); editMenu=newMenu(shell,SWT.DROP_DOWN); editMenuHeader.setMenu(editMenu); editCopyItem=newMenuItem(editMenu,SWT.PUSH); editCopyItem.setText("&Copy"); //添加菜单项的事件监听器 fileExitItem.addSelectionListener(newMenuItemListener()); fileSaveItem.addSelectionListener(newMenuItemListener()); editCopyItem.addSelectionListener(newMenuItemListener()); fileEnglishItem.addSelectionListener(newRadioItemListener()); fileGermanItem.addSelectionListener(newRadioItemListener()); shell.setMenuBar(menuBar); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()) display.sleep(); } display.dispose(); } classMenuItemListenerextendsSelectionAdapter{ publicvoidwidgetSelected(SelectionEventevent){ text.setText("Youselected"+((MenuItem)event.widget).getText()); if(((MenuItem)event.widget).getText().equals("E&xit")){ shell.close(); } } } classRadioItemListenerextendsSelectionAdapter{ publicvoidwidgetSelected(SelectionEventevent){ MenuItemitem=(MenuItem)event.widget; text.setText(item.getText()+"ison."); } } publicstaticvoidmain(String[]args){ MenuExamplemenuExample=newMenuExample(); } } 以上程序中添加了主菜单,并在主菜单中添加了两个子菜单项,子菜单项添加了相应的事件响应机制,程序运行效果如图1所示。 图1Menu\MenuItem组件 菜单是可以级联的,在子菜单中还能够包含其它的菜单项。 工具栏组件ToolBar和ToolItem ToolBar是SWT中的工具栏组件,ToolItem是工具栏中的工具项(一般表现为按钮或分隔符,也可以是其他组件),在程序中添加工具栏的步骤如下: 1.创建ToolBar对象,并指定创建的样式,例如“toolBar=newToolBar(shell,SWT.FLAT|SWT.WRAP|SWT.RIGHT);”。 2.创建ToolItem对象,并指定创建样式,例如“ToolItemitemPush=newToolItem(toolBar,SWT.PUSH);”。 3.设置ToolItem的图标和相关属性,例如“itemPush.setImage(icon);”。 4.添加ToolItem的事件监听器,例如“itemPush.addListener(SWT.Selection,selectionListener);”。 为了更好地掌握工具栏组件,下面通过一个实例演示如何创建工具栏组件,代码如例程2所示。 例程2ToolBarExample.java publicclassToolBarExample{ Displaydisplay=newDisplay(); Shellshell=newShell(display); ToolBartoolBar; publicToolBarExample(){ //添加工具栏 toolBar=newToolBar(shell,SWT.FLAT|SWT.WRAP|SWT.RIGHT); //添加工具项 ToolItemitemPush=newToolItem(toolBar,SWT.PUSH); itemPush.setText("PUSHitem"); //设置工具项的显示图标 //Imageicon=newImage(shell.getDisplay(),"icons/new.gif"); //itemPush.setImage(icon); ToolItemitemCheck=newToolItem(toolBar,SWT.CHECK); itemCheck.setText("CHECKitem"); ToolItemitemRadio1=newToolItem(toolBar,SWT.RADIO); itemRadio1.setText("RADIOitem1"); ToolItemitemRadio2=newToolItem(toolBar,SWT.RADIO); itemRadio2.setText("RADIOitem2"); ToolItemitemSeparator=newToolItem(toolBar,SWT.SEPARATOR); finalToolItemitemDropDown=newToolItem(toolBar,SWT.DROP_DOWN); itemDropDown.setText("DROP_DOWNitem"); itemDropDown.setToolTipText("Clickheretoseeadropdownmenu..."); finalMenumenu=newMenu(shell,SWT.POP_UP); newMenuItem(menu,SWT.PUSH).setText("Menuitem1"); newMenuItem(menu,SWT.PUSH).setText("Menuitem2"); newMenuItem(menu,SWT.SEPARATOR); newMenuItem(menu,SWT.PUSH).setText("Menuitem3"); //设置工具项的事件监听器 itemDropDown.addListener(SWT.Selection,newListener(){ publicvoidhandleEvent(Eventevent){ if(event.detail==SWT.ARROW){ Rectanglebounds=itemDropDown.getBounds(); Pointpoint=toolBar.toDisplay(bounds.x,bounds.y +bounds.height); //设置菜单的显示位置 menu.setLocation(point); menu.setVisible(true); } } }); //设置工具项的事件监听器 ListenerselectionListener=newListener(){ publicvoidhandleEvent(Eventevent){ ToolItemitem=(ToolItem)event.widget; System.out.println(item.getText()+"isselected"); if((item.getStyle()&SWT.RADIO)!=0 ||(item.getStyle()&SWT.CHECK)!=0) System.out.println("Selectionstatus:" +item.getSelection()); } }; itemPush.addListener(SWT.Selection,selectionListener); itemCheck.addListener(SWT.Selection,selectionListener); itemRadio1.addListener(SWT.Selection,selectionListener); itemRadio2.addListener(SWT.Selection,selectionListener); itemDropDown.addListener(SWT.Selection,selectionListener); toolBar.pack(); shell.addListener(SWT.Resize,newListener(){ publicvoidhandleEvent(Eventevent){ RectangleclientArea=shell.getClientArea(); toolBar.setSize(toolBar.computeSize(clientArea.width, SWT.DEFAULT)); } }); shell.setSize(400,100); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } display.dispose(); } publicstaticvoidmain(String[]args){ newToolBarExample(); } } 程序添加了工具栏,并在工具栏中添加了相应的工具项,工具项中添加了相应的事件响应机制,程序运行效果如图2所示。 图2工具栏组件 本示例显示了工具栏和菜单栏的配合使用,菜单动态设定显示的位置。 工具栏组件CoolBar和CoolItem CoolBar是另外一种形式的工具栏,它能够调整CoolItem的位置,每一个CoolItem可以设定相关的组件(也可以是另一个工具栏),创建CoolBar的步骤如下: 1.创建CoolBar对象,并指定创建的样式,例如“CoolBarcomposite=newCoolBar(parent,SWT.NONE);”。 2.创建CoolItem对象,并指定创建样式,例如“CoolItemitem=newCoolItem(composite,SWT.NONE);”。 3.设置CoolItem的Control对象,例如“item.setControl(tb);”。 CoolBar相当于一个面板容器,CoolItem是容器中的每一项,CoolItem能设置相应的组件作为此项的子容器(也可以是其他组件)。为了更好地掌握CoolBar组件,下面通过一个实例演示如何创建CoolBar组件,代码如例程3所示。 例程3CoolBarExample.java publicclassCoolBarExampleextendsApplicationWindow{ publicCoolBarExample(){ super(null); } protectedControlcreateContents(Compositeparent){ getShell().setText("CoolBarTest"); StringasCoolItemSection[]={"File","Formatting","Search"}; //添加CoolBar CoolBarcomposite=newCoolBar(parent,SWT.NONE); for(intidxCoolItem=0;idxCoolItem<3;++idxCoolItem){ CoolItemitem=newCoolItem(composite,SWT.NONE); //添加子组件 ToolBartb=newToolBar(composite,SWT.FLAT); for(intidxItem=0;idxItem<3;++idxItem){ ToolItemti=newToolItem(tb,SWT.NONE); ti .setText(asCoolItemSection[idxCoolItem]+"Item#" +idxItem); } Pointp=tb.computeSize(SWT.DEFAULT,SWT.DEFAULT); tb.setSize(p); Pointp2=item.computeSize(p.x,p.y); //设置为一个CoolItem的控制类 item.setControl(tb); item.setSize(p2); } returncomposite; } publicstaticvoidmain(String[]args){ CoolBarExampleapp=newCoolBarExample(); app.setBlockOnOpen(true); app.open(); Display.getCurrent().dispose(); } } 以上代码演示了如何创建CoolBar。CoolBar中每一个CoolItem可以根据用户的需要调整位置,程序运行效果如图3所示。 图3CoolBar组件 CoolBar和ToolBar的展现样式不一样,CoolBar可以动态调整工具栏的位置。 滚动组件Slider 为了方便用户输入数据,SWT中提供了Slider组件,用户可通过Slider设置数据的增量值,用来控制其他组件,也可以作为滚动条控制其他组件中的数据显示。添加Slider组件的步骤如下: 1.创建Slider对象,并指定创建的样式,例如“Sliderslide=newSlider(shell,SWT.HORIZONTAL);”。 2.设置Slider的最大值和最小值,例如“slide.setMaximum(100);”。 3.设置Slider增量的增加或递减值,例如“slide.setIncrement(1);”。 4.添加Slider的事件监听器,例如“slide.addSelectionListener(selectionListener);”。 为了更好地掌握Slider组件,下面通过一个实例演示如何创建Slider组件,代码如例程4所示。 例程4SliderExample.java publicclassSliderExample{ Displaydispaly; Shellshell; SliderExample(){ dispaly=newDisplay(); shell=newShell(dispaly); shell.setSize(300,250); shell.setText("ASliderExample"); //添加Slider对象 finalSliderslide=newSlider(shell,SWT.V_SCROLL); //设置Slider的位置和大小 slide.setBounds(170,25,25,20); //设置Slider的最小值 slide.setMinimum(0); //设置Slider的最大值 slide.setMaximum(100); //设置Slider单击左右箭头的增加或递减值 slide.setIncrement(1); finalTextt=newText(shell,SWT.BORDER); t.setBounds(115,25,55,20); t.setText("0"); t.setFocus(); //添加Slider的事件监听器 slide.addSelectionListener(newSelectionAdapter(){ publicvoidwidgetSelected(SelectionEvente){ t.setText(newInteger(slide.getSelection()).toString()); } }); shell.open(); while(!shell.isDisposed()){ if(!dispaly.readAndDispatch()) dispaly.sleep(); } dispaly.dispose(); } publicstaticvoidmain(String[]args){ newSliderExample(); } } 以上代码添加了一个Text组件和一个Slider组件。Slider组件设置了增量值为1,另外Slider组件添加了选择事件,当选择了Slider组件后,Slider将为Text组件赋值。程序运行效果如图4所示。 图4Slider组件 Slider组件要配合其它的组件使用,辅助其它的组件完成功能。 刻度组件Scale Scale和Slider类似,在SWT中都表示一种尺度,但两者的表现形式不一样,Scale更像一个刻度,而Slider则是提供一个滚动条。添加Scale组件的步骤如下: 1.创建Scale对象,并指定创建的样式,例如“Scalescale=newScale(shell,SWT.VERTICAL);”。 2.设置Scale的最大值和最小值,例如“scale.setMaximum(20);”。 3.设置Scale增量的增加或递减值,例如“scale.setPageIncrement(5);”。 4.添加Scale的事件监听器,例如“scale.addSelectionListener(selectionListener);”。 为了更好地掌握Scale组件,下面通过一个实例演示如何创建Scale组件,代码如例程5所示。 例程5ScaleExample.java publicclassScaleExample{ Displaydisplay=newDisplay(); Shellshell=newShell(display); Scalescale; Textvalue; publicScaleExample(){ shell.setLayout(newGridLayout(1,true)); Labellabel=newLabel(shell,SWT.NULL); label.setText("Volume:"); //添加Scale组件 scale=newScale(shell,SWT.VERTICAL); scale.setBounds(0,0,40,200); //设置Scale的最大值 scale.setMaximum(20); //设置Scale的最小值 scale.setMinimum(0); //设置Scale的增量值 scale.setPageIncrement(5); //添加Scale的事件监听器 scale.addListener(SWT.Selection,newListener(){ publicvoidhandleEvent(Eventevent){ intperspectiveValue=scale.getMaximum()-scale.getSelection()+ scale.getMinimum(); value.setText("Vol:"+perspectiveValue); } }); value=newText(shell,SWT.BORDER|SWT.SINGLE); value.setEditable(false); scale.setLayoutData(newGridData(GridData.HORIZONTAL_ALIGN_CENTER)); value.setLayoutData(newGridData(GridData.HORIZONTAL_ALIGN_CENTER)); shell.pack(); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } display.dispose(); } privatevoidinit(){ } publicstaticvoidmain(String[]args){ newScaleExample(); } } 上例中,通过事件监听器监听当前选择的刻度,并用Text组件显示出来,程序运行效果如图5所示。 图5Scale组件 Scale组件能够精确的显示刻度,用户可以设制好刻度的范围,这是非常有用的。 进度条组件ProgressBar ProgressBar是SWT中的进度条组件。进度条提供了比较长时间操作的进度信息。添加ProgressBar组件的步骤如下: 1.创建ProgressBar对象,并指定创建的样式,例如“ProgressBarpb1=newProgressBar(shell,SWT.HORIZONTAL|SWT.SMOOTH);”。 2.设置ProgressBar的最大值和最小值,例如“pb1.setMaximum(30);”。 3.在长时间的任务中设置当前进度条的进度,例如“progressBar.setSelection(progressBar.getSelection()+1);”。 进度条能反映当前的工作进度,为了配合处理长时间的任务,进度条经常配合线程使用,以免产生阻塞影响界面的操作。为了更好地掌握ProgressBar组件,下面通过一个实例演示如何创建ProgressBar组件,代码如例程6所示。 例程6ProgressBarExample.java publicclassProgressBarExample{ publicstaticvoidmain(String[]args){ Displaydisplay=newDisplay(); Shellshell=newShell(display); shell.setLayout(newGridLayout()); //添加平滑的进度条 ProgressBarpb1=newProgressBar(shell,SWT.HORIZONTAL|SWT.SMOOTH); pb1.setLayoutData(newGridData(GridData.FILL_HORIZONTAL)); //设置进度条的最小值 pb1.setMinimum(0); //设置进度条的最大值 pb1.setMaximum(30); //添加自动递增的进度条 ProgressBarpb2=newProgressBar(shell,SWT.HORIZONTAL| SWT.INDETERMINATE); pb2.setLayoutData(newGridData(GridData.FILL_HORIZONTAL)); //添加线程,在线程中处理长时间的任务,并最终反映在平滑进度条上 newLongRunningOperation(display,pb1).start(); shell.open(); while(!shell.isDisposed()){ if(!display.readAndDispatch()){ display.sleep(); } } } } classLongRunningOperationextendsThread{ privateDisplaydisplay; privateProgressBarprogressBar; publicLongRunningOperation(Displaydisplay,ProgressBarprogressBar){ this.display=display; this.progressBar=progressBar; } publicvoidrun(){ //模仿长时间的任务 for(inti=0;i<30;i++){ try{ Thread.sleep(1000); }catch(InterruptedExceptione){ } display.asyncExec(newRunnable(){ publicvoidrun(){ if(progressBar.isDisposed())return; //进度条递增 progressBar.setSelection(progressBar.getSelection()+1); } }); } } } 以上代码添加了两个进度条,一个进度条为自动显示增加进度的信息(SWT.INDETERMINAT样式),另外一个进度条通过线程处理长时间的任务,并设定进度条的信息。程序运行效果如图6所示。 图6ProgressBar组件 进度条有不同的样式,在程序中,开发人员可以控制进度条的进度,执行某些长时间的操作。 |
|
来自: ShangShujie > 《java》