快速业务通道

用Java SWT实现MSN风格的下拉框 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
将各个子组件在其父组件上的坐标依次相加。

方法如下:

private Point getScreemLocation() { Control control = this; int width = control.getLocation().x; int height = control.getLocation().y; while (control.getParent() != null) { control = control.getParent(); width += control.getLocation().x; height += control.getLocation().y; } return new Point(width, height); }

现在让我们完成构造函数

super(parent, SWT.FLAT); inputText = new Text(this, SWT.FLAT); selectorMenu = new Menu(this); setMenu(selectorMenu);

首先实现父组件的构造器,注意,将风格设置为FLAT或者NONE。如果为BORDER,那么运行时会发现组件是凹陷下去的外观(WindowsXP以前就是这种外观),通常对于自定义的外观都需要将风格设置为SWT.FLAT或者SWT.NONE。然后创建基本文本、菜单。对于菜单需要注意的是除了在构造时候要指定父组外,还要调用setMenu将菜单加进来。

接下来一步很关键,是要进行自定义绘制。绘制包括边框和下拉按钮的图标。

完整代码如下:

addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { GC gc = e.gc; gc.setForeground(isEnabled() ? ENABLED_LINE_COLOR : DISABLED_LINE_COLOR); gc.drawRectangle(0, 0, getSize().x - 1, getSize().y - 1); gc.drawImage(COMBO_ICON, getSize().x - COMBO_ICON.getBounds().width - 5, (getSize().y - COMBO_ICON.getBounds().height) / 2); } });

首先根据组件是否可用决定边框的颜色。调用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); } });

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

时间:2011-01-19

给该组件注册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(); }

第一行的super.setEnabled(enabled); 表示保持父类enable属性不变化,之后是设置背景,并设置inputText的enabled属性,最后调用redraw方法通知组件重绘。需要阐明的是,redraw方法会调用PaintListener中的方法,也就是说会调用到构造函数中public void paintControl(PaintEvent e){...}这段代码,如果组件添加了多个绘

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号