
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
| private final Color ENABLED_LINE_COLOR = new Color(Display.getCurrent(), 170, 183, 199); private final Color DISABLED_LINE_COLOR = new Color(Display.getCurrent(), 208, 215, 229); private final Color ENABLED_BG = new Color(Display.getCurrent(), 254, 254, 254); private final Color DISABLED_BG = new Color(Display.getCurrent(), 238, 241, 249); private final Image COMBO_ICON = new Image(Display.getDefault(), "combo.png"); |
| private Text inputText; private Menu selectorMenu; |
| private Object selectedItem; private Vector dataSet = new Vector(); |
| public ComboSelector(Composite parent) {...} |
| 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); |
| 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); } }); |
| addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e) { inputText.setBounds(1, 1, getSize().x - COMBO_ICON.getBounds().width - 15, getSize().y - 2); } }); |
| 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){...}这段代码,如果组件添加了多个绘制监听器,那么redraw会依次调用每个监听器的paintControl方法,这与swing的事件机制是相同的。在redraw方法中根据isEnabled()的值决定边框的颜色,所以每当setEnable方法被调用都应该执行重绘。