Advanced SWT Widegts 2nd

前言:还是继续翻译吧~哎,人生啊~CSDN,你你你~我无语了已经……没有保存何必把这么多功能做在一个页面里面!??

Trees
树形结构常常被用来把信息层次化显示,比如在一个文件管理器中显示一些包含子文件夹的文件夹,或者是在类工具浏览窗口显示类和它的子类的信息。接下来的代码(TreeDemo.java)创建了一个树形结构。树形结构的标准样式有:SWT.MULTI,SWT.SINGLE和SWT.CHECK。SINGLE样式限制树形结构一次只能有一个对象(item)被选中,而MULTI就允许多重选中(multiple selections)。两者中一次只能选择一个样式。CHECK样式在树形结构中的每个对象前添加了一个复选框(check box)。举个例子说,Eclipse用这种CHECK样式的树形结构让用户选择在一个文件夹中导入或导出什么文件。
下面我们创建的树形结构允许多重选定,并且带有边框。照往常一样,树形结构的构造函数的第一个参数是一个Composite,它指明这个Tree放在哪个容器里面。第二个参数是SWT的样式常量。

final Tree tree = new Tree(shell, SWT.MULTI | SWT.BORDER);
tree.setSize(150, 150);
tree.setLocation(5,5);

我们必须添加对象(TreeItems)到这个Tree里面。我们先创建三个顶(根)级的对象。构造函数的第一个参数是我们要放置到的Tree对象(因为TreeItem是隶属于Tree的,就像控件隶属于一个Composite一样的道理)。第二个参数是SWT的样式常量,最后一个可选的参数是这个对象在Tree中的索引号。在这个例子里面,参数1表示“My Doucuments”对象在其他两个对象的中间,即使它是最后添加的对象。

TreeItem myComp = new TreeItem(tree, SWT.NONE);
myComp.setText("My Computer");
TreeItem netPlaces = new TreeItem(tree, SWT.NONE);
netPlaces.setText("My Network Places");
TreeItem myDocs = new TreeItem(tree, SWT.NONE, 1);
myDocs.setText("My Documents");

创建自对象,并且让它显示在“My Computer”节点下面,我们用类似的构造函数实现。我们还能用最后那个可选的参数来指定子树中新添加元素的索引号。

TreeItem hardDisk = new TreeItem(myComp, SWT.NONE);
hardDisk.setText("Local Disk (C:)");
TreeItem floppy = new TreeItem(myComp, SWT.NONE, 0);
floppy.setText("3.5 Floppy (A:)");

我们可以通过简单的创建TreeTiems来继续生成更多的子树。这里我们通过建立一个“Local Disk”对象把树扩展成三层结构。

TreeItem progFiles = new TreeItem(hardDisk, SWT.NONE);
progFiles.setText("Program Files");

我们还可以在TreeItem中添加图象。照往常一样(见“The section on Images”),我们载入图象然后用TreeItem的setImage方法来添加图片显示:

Image icon = new Image(display, "arrow.bmp");
progFiles.setImage(icon);

当progFiles对象显示在树中时,图象会同时显示在该对象文字说明的左边。
我们现在给树形结构添加监听事件。在我们上面的Menus的例子里面,监听时添加一个给MenuItems,但是在树形结构的例子里面,这个监听的对象是整个树!我们给树添加一个选择(selection)listener,然后就可以用树的getSelection()方法返回一个选择的对象的列表。在下面的例子中,我们监听树是否有改变选择的对象,如果有就得到一个选中的TreeItem的数组集合,并且在输出窗口打印每个对象的text属性内容。

tree.addSelectionListener(new SelectionAdapter() {
 public void widgetSelected(SelectionEvent e) {
 TreeItem[] t = tree.getSelection();
 System.out.print("Selection: ");
 for(int i = 0; i < t.length; i++) {
  System.out.print(t[i].getText() + ", ");
 }
 System.out.println();
 }
});

我们还可以用TreeListener对象来监听树收起或者展开内部对象或子树的事件。我们可以在相应的事件发生时输出“Tree collaspsed”或者“Tree expanded”的信息。

tree.addTreeListener(new TreeListener() {
 public void treeCollapsed(TreeEvent e) {
  System.out.println("Tree collapsed.");
 }
 public void treeExpanded(TreeEvent e) {
  System.out.println("Tree expanded.");
 } 
});

程序运行的结果应该看起来和下面的图片效果有点类似:


如果你使用了Tree的SWT.CHECK样式的话,那么用TreeItem的getChecked()方法可以用来检测树中的一个独特的对象是否被选中了。

<---------------------------------------------------->-<Soso家可爱的分割线>-<---------------------------------B--------------------->

哎,只能说CSDN的Blog功能还不够人性化……不小心按了个BackSpace,又付之东流一下下……默哀……早上9点还要去萧山一个公司面试,昏,地图上看了下,萧山好远~现在都临晨两点了~刚才顺便把PB的Section 14看完了,舒畅~希望早点出完,不要再没完没了出个N Season了~又想起以前看X-Files的经历~9 Season啊~把我折磨的……反正我以后不再这里直接编辑了,用NotePad都……哎……

<---------------------------------------------------->-<Soso家可爱的分割线>-<---------------------------------E--------------------->

ToolBars
现在我们来看一下工具栏控件。工具栏是一种让用户免除在层叠的菜单里面寻找的痛苦,并提供了一种便

捷并且高效率的捷径!它使得频繁被用到的任务更加高效率。在工具栏上的按钮除了能包括图象和文字以

及布局被放置成一组之外其实和标准按钮如出一辙。
我们将要创建一个简单的工具栏(ToolBarDemo.java),它由一些标准的按钮组成,有些有图象,有些只

有文字等。首先,我们在shell上创建一个工具栏。

final ToolBar bar = new ToolBar(shell,SWT.HORIZONTAL);
bar.setSize(380,150);
bar.setLocation(10,10);

我们想要在一些按钮上安上图象,因此我们必须要先把图象加载到Image对象中去。

Image icon = new Image(display, "arrow.bmp");

然后,我们实例化三个ToolItem(工具栏对象,就像上面提到的Tree和TreeItem的关系一样)。每个都是

基本的按钮样式。第一个按钮上有“Push”的文字,第二个会包含一个刚才我们载入的图象,最后一个是

前两个的结合体——包含图象和文字的按钮。

ToolItem pushItem1 = new ToolItem(bar, SWT.PUSH);
pushItem1.setText("Push");
ToolItem pushItem2 = new ToolItem(bar, SWT.PUSH);
pushItem2.setImage(icon);
ToolItem pushItem3 = new ToolItem(bar, SWT.PUSH);
pushItem3.setText("Push");
pushItem3.setImage(icon);

就像菜单中一样,我们用SEPARATOR样式可以在工具栏中在不同的对象之间建立一个可见的分隔线。

ToolItem sep = new ToolItem(bar, SWT.SEPARATOR);

同样,和正常的按钮以及菜单控件类似,我们还能用CHECKRADIO样式的按钮。ToolItem的

getSelection()方法可以用来确定其中哪一个单选按钮或者一个复选框按钮被选择了。

ToolItem checkItem = new ToolItem(bar, SWT.CHECK);
checkItem.setText("Check");
ToolItem sep2 = new ToolItem(bar, SWT.SEPARATOR);

我们现在来添加两个单选按钮,一个分隔线和另外两个单选按钮。还有两件重要的事情要提醒大家。首先

,单选按钮的状态是被自动设置好的(相对菜单来说,它的状态必须要程序员手动编程控制),其次,只

有相邻的单选按钮才会套用相同的行为状态。如果另外一种ToolItem对象被放在了两个单选对象之间的话

,那么那两个被分离的单选按钮就不会被编成一组了(众所周知,单选按钮只有在编组以后才有用么),

而且它们可以同时被独立选择。下面的一块代码演示了这种情况——一个分隔线对象把两个相邻的Radio

分为“两组”。

ToolItem radioItem1 = new ToolItem(bar, SWT.RADIO);
radioItem1.setText("Radio 1");
ToolItem radioItem2 = new ToolItem(bar, SWT.RADIO);
radioItem2.setText("Radio 2");
ToolItem sep3 = new ToolItem(bar, SWT.SEPARATOR);
ToolItem radioItem3 = new ToolItem(bar, SWT.RADIO);
radioItem3.setText("Radio 3");
ToolItem radioItem4 = new ToolItem(bar, SWT.RADIO);
radioItem4.setText("Radio 4");

最后的一种工具栏内部对象是下拉按钮。左半边的下拉按钮就像一个标准的PUSH按钮一样,而右半边有一

个下拉箭头掩饰了一个下拉菜单。要把一个下拉菜单依附到一个下拉工具栏内部对象上去,你必须获取在

这个对象上的选择事件,并且用SelectionEvent的(x,y)来测定在屏幕的哪里放置相应的弹出菜单。在

Eclipse.org网站的SWT Resources页面上有演示这以技术的代码片段。我们这里把它拿来并修改成适合我

们演示的例子。

final  ToolItem dropdown  =   new  ToolItem(bar, SWT.DROP_DOWN);
dropdown.setText(
" Drop-down " );
final  Menu menu  =   new  Menu(shell, SWT.POP_UP);
MenuItem choice 
=   new  MenuItem(menu, SWT.PUSH);
choice.setText(
" Choices " );
dropdown.addListener(SWT.Selection, 
new  Listener() {
           
public   void  handleEvent(Event event) {
                      
if  (event.detail  ==  SWT.ARROW) {
                                 Rectangle rect 
=  dropdown.getBounds();
                                 Point pt 
=   new  Point(rect.x, rect.y  +  rect.height);
                                 pt 
=  bar.toDisplay(pt);
                                 menu.setLocation(pt.x, pt.y);
                                 menu.setVisible(
true );
                      }
           }
});

 

最后,我们演示一些工具栏的基本的事件处理。比如给一个PUSH按钮添加一个SelectionListener监听器

。当正确(最左边)的按钮被按下时,控制台上会输出一条消息。

pushItem1.addSelectionListener(  new  SelectionListener () {
         
public   void  widgetSelected(SelectionEvent e) {
                  System.out.println(
" Push button one selected. " );
         }
         
public   void  widgetDefaultSelected(SelectionEvent e) {
         }
});

 

结果应该看起来和下面的贴图差不多效果:

CoolBars
CoolBar时用来使得创建的ToolBar类似于一个个的单个对象,并且这些单个独立的对象可以由用户来动态

得重新定位(就像很多软件里面的那些工具栏是一组一组的,并且可以换位置,当然是以组为单位)。举

个例子,在屏幕里Eclipse工作平台的顶部就是一些CoolBar,你可以点住这些垂直的竖条(看上去像这样

)并且拖动,把这组按钮集合在工具栏里重新定位。类似的CoolBar也可以在微软的Word和IE上看到踪

迹。
我们将会创建一个简单的CoolBar(CoolBarDemo.java)的例子,它包括三个内部对象(CoolItem)。每

个CoolItem代表了一段可以被移动的CoolBar。我们可以在每个CoolItem上放置任何我们想要的控件。在

下面的例子中,我们会创建一个空的CoolItem,两个CoolItem分别一些按钮以及一个包含ToolBar的

CoolItem。
我们按照标准创建控检的方法建立一个CoolBar,并设置它的边框样式。然后创建四个CoolItem并添加到

这个“bar”里面。

final CoolBar bar = new CoolBar(shell, SWT.BORDER);
CoolItem item1 = new CoolItem(bar, SWT.NONE);
CoolItem item2 = new CoolItem(bar, SWT.NONE);
CoolItem item3 = new CoolItem(bar, SWT.NONE);
CoolItem item4 = new CoolItem(bar, SWT.NONE, 2);

接下来我们必须创建每个在CoolItem上的控件。首先是一个有边框且平面的按钮,它是用来掩饰锁定和解

锁这个CoolBar的。

Button button1 = new Button(bar, SWT.FLAT | SWT.BORDER);
button1.setText("Button");
button1.pack();

通过pack方法设置好它的正确尺寸。接下来我们添加一个listener,每当这个按钮被点击的时候它都会调

用bar.setLocked(boolean)来锁定或解锁CoolBar。

button1.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                        bar.setLocked(!bar.getLocked()) ;
            }
});

下一个按钮是一个正常的按钮。

Button button2 = new Button(bar, SWT.PUSH);
button2.setText("Another button");
button2.pack();

CoolBar最平常的作用就是创建一个用户可以自由安排位置的工具栏。这也是Eclipse所采用的。下一段代

码片在相应的CoolItem上放置了两个基本按钮的工具栏。

ToolBar tools = new ToolBar(bar, SWT.NONE);
ToolItem b1 = new ToolItem(tools, SWT.FLAT);
b1.setText("Tool");
ToolItem b2 = new ToolItem(tools, SWT.FLAT);
b2.setText("Bar");
tools.pack();

每个控件都设置好以后我们就可以用CoolItem的setControl()方法把控件添加到CoolItem里面。我们还可

以用setSize方法设置每个控件的初始大小。注意item3调用的setMinimumSize方法,它保证了当用户重新

调整CoolBar时,含有ToolBar的CoolItem的尺寸不会收缩到我们设定的大小以下——这里的最小大小就设

定成了ToolBar本身的大小。

Point size = button1.getSize();
item1.setControl(button1);
item1.setSize(item1.computeSize(size.x, size.y));
size = button2.getSize();
item2.setControl(button2);
item2.setSize(item2.computeSize(size.x, size.y));
size = tools.getSize();
item3.setControl(tools);
item3.setSize(item3.computeSize(size.x, size.y));
item3.setMinimumSize(size);

最后,setWrapIndices方法用来在特定索引号时控件换行显示用的。bar实例的setSize方法在shell上显

示的时候指明了它的大小。

bar.setWrapIndices(new int[] {3});
bar.setSize(300, 120);

这里给出一个CoolBar初始化显示的效果图:

拖动并重新排位并锁定CoolBar后的效果图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值