打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Eclipse开发经典教程:展现组件
 【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组件

  进度条有不同的样式,在程序中,开发人员可以控制进度条的进度,执行某些长时间的操作。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Swt常用控件中文教程
SWT的状态栏和进度条的实例
SWT(JFace)体验之RowLayout布局
理解SWT布局
JAVA.SWT/JFace: JFace篇之JFace对话框
Eclipse RCP 开发:从登录对话框说开去 - 海边沫沫 - BlogJava
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服