用Java SWT实现MSN风格的下拉框

豆豆网   技术应用频道   2008年01月10日    社区交流

内容摘要:严格来说如果你的用户对外观要求比较苛刻,那么Swing是首选,因为L&F机制可以确保你做到这一点,另外Swing还有着许多SWT不具备的优点,例如半透明组件、渲染等,但是少数的这些特性用SWT还是可以模拟的,本文就向大家介绍如何通过自定义组件实现MSN风格的下拉框。

  然后绘制图标,注意,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();
}

责编:豆豆技术应用

正在加载评论...