菜单组件
在程序中,菜单是提供信息比较好的方式,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组件
进度条有不同的样式,在程序中,开发人员可以控制进度条的进度,执行某些长时间的操作。
联系客服