|
首先根据组件是否可用决定边框的颜色。调用drawRectangle完成绘制边框的操作。
然后绘制图标,注意,drawImage后两个参数是绘制的坐标,也就是从哪里开始画起,模拟MSN用户名输入组件时,下拉按钮右端点x坐标取距离组件最右端x坐标(getSize().x)5像素处为最佳,因此计算得出下拉按钮左端点x坐标为getSize().x- COMBO_ICON.getBounds().width - 5。(左端点x坐标与右端点x坐标相差COMBO_ICON.getBounds().width应该很容易理解,另外读者对坐标系的概念应该有一定了解);对于按钮的y坐标,计算思想是使按钮的垂直位置居中,因此计算y坐标公式为(getSize().y - COMBO_ICON.getBounds().height) / 2)。
接下来一步是确定基本文本组件的位置,完整代码如下:
addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e) {
inputText.setBounds(1, 1, getSize().x
- COMBO_ICON.getBounds().width - 15, getSize().y - 2);
}
});
给该组件注册Control监听器时,当该组件尺寸发生变化,会触发controlResized方法,在该方法内对基本文本组件的位置进行调整。模拟MSN用户名输入组件原则是,基本文本组件的边框被隐藏(构造时候通过将Style设为SWT.FLAT),左端点x坐标为1(为0的话会遮挡边框线的左端),长度是整个组件长度减去下拉按钮的长度再减15像素为最佳,从而保证与下拉按钮之间有一段距离,高度是整个组件的高度减2像素,过高会遮挡边框线。
接着我们要重写setEnabled方法,代码如下:
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
setBackground(enabled ? ENABLED_BG : DISABLED_BG);
inputText.setEnabled(enabled);
redraw();
}