跳转到路径导航栏
跳转到正文内容

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

http://www.sina.com.cn  2008年12月31日 10:57  比特网ChinaByte

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

  }

>话题讨论查看全部评论

已有 _COUNT_位网友发表评论  
登录名: 密码: 匿名发表

Powered By Google
flash

新浪简介About Sina广告服务联系我们招聘信息网站律师SINA English会员注册产品答疑┊Copyright © 1996-2009 SINA Corporation, All Rights Reserved

新浪公司 版权所有