自定义SWT组件

在Window上所有的组件都是用画出来的,所以redraw的观念应该没什么问题。如果你想自订Control,这表示目前现有的组件已经无法提供你所要的功能。
这也证明事情很大条,你必须要去用Graphic去画一大堆Control的图形,还要管理Mouse click时图形要如何变化。光是画这些图你就已经很靠背了。

所以,除非到山穷水尽的地步,不然不要干这种事。

自订Control要注意以下几点事项:
1.继承Composite。选择继承Composite就表示可能会有其它人继承你的Control。
2.继承Canvas。选择继承Canvas就表示未来不会有人再继承你的Control。
3.覆写(Override)computeSize()的方法,该方法形式如下:

public Point computeSize(int wHint, int hHint, boolean changed);

先说明一下此方法是作用。
一般SWT Control,可以指定Size(尺寸)和Location(位置)。例如:

SWTControl.setSize(100, 100);
SWTControl.setLocation(10, 10);

但是某些情况下,我们希望SWT Control的Size是能够依照内容所占的比例而自动设定,这时我自只要呼叫SWT Control的pack()方法。Control就会自动配置尺寸。
请注意, SWT Control凭什么自动判断Control的尺寸 ?
答案就是,SWT Control会去呼叫computeSize()来计算尺寸的大小。
讲到这里你也应该很清楚computeSize()的作用。所以你之所以实作computeSize()方法,就是为了让SWT Control能够自动计算SWT Control的尺寸。

再来先绍介参数(Parameter)
wHint:此参数全名叫Width Hint,这样你应该可以看出一点弊端。「宽度暗示」,也就是说,当你希望computeSize()计算之后的宽度(Width)能够是自己指定的值,而不要经由computeSize()去计算,那么你就可以指定你所想要的值。我猜你不知我在讲三小,举例说明比较容易:

Point resultSize = SWTControl.computeSize(100, SWT.DEFUALT);
System.out.println("Width:" + resultSize.x);
System.out.println("Height:" + resultSize.y);

得到的结果

Width:100 // 因为这个是我所指定的值,所以computeSize()不会变更它
Height:23 // 而这个结果是我未指定(设成SWT.DEFUALT),就会经过computeSize()计算出结果

我想,智障也看的懂我想表达的东西,你再看不懂,也只好去撞墙了。

hHint:同上。
changed:这是为了快取而设的参数值。因为并不是每次SWT Control去呼叫computeSize()时,SWT Control的尺寸都会变更,有时候明明尺寸没有变更,却还要再去计算一次,那是一件很耗效能的事情。
所以,当你接到的changed是true时,则表示尺寸已经变更,需要再重新计算一次。相对的,如果接到false,就表示尺寸没变更,只要把上一次的结果值回傅回去就可以了,省下不必要的计算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值