`
sslaowan
  • 浏览: 380488 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

扩展swt combo

阅读更多

原文链接:http://blog.csdn.net/kentchenj/archive/2008/10/14/3074623.aspx

swt的combo有两个麻烦的问题:

  1. 如果选中上次选中的内容,它照样会触发addSelectionListener方法
  2. 如果使用setData(String key, Object value)时,必须设定key值。通常会使用index作为key值。但是如果删除了一项,它的index会自动-1,不能和key相对应了
为了解决这个问题,重新写了一个Combo类
要解决问题1,写了一个新的接口:
  1. public interface SelectionChangedListener {
  2.     /**
  3.      * 类似SelectionListener
  4.      * @param event
  5.      */
  6.     public void selectionChanged(SelectionEvent event);
  7. }
要解决问题2,定义一个类保存combo的状态
  1. public class ComboState {
  2.     private int selectionIndex = -1;
  3.     public int getSelectionIndex() {
  4.         return selectionIndex;
  5.     }
  6.     public void setSelectionIndex(int selectionIndex) {
  7.         this.selectionIndex = selectionIndex;
  8.     }
  9. }
Combo类如下:
  1. public class EasyCombo extends Combo {
  2.     private ComboState state;
  3.     private List<Object> indexData = new LinkedList<Object>();
  4.     private List<SelectionChangedListener> scls = new ArrayList<SelectionChangedListener>();
  5.     public EasyCombo(Composite parent, int style) {
  6.         super(parent, style);
  7.         this.setState(new ComboState());
  8.     }
  9.     /**
  10.      * 封装SelectionChangedListener事件
  11.      */
  12.     public void addSelectionChangedListener(SelectionChangedListener listener) {
  13.         if (scls.size() == 0) {// 第一次add,会创建addSelectionListener事件
  14.             addSelectionListener(new SelectionListener() {
  15.                 public void widgetDefaultSelected(SelectionEvent e) {
  16.                 }
  17.                 public void widgetSelected(SelectionEvent e) {
  18.                     if (getState().getSelectionIndex() != getSelectionIndex()) {
  19.                         getState().setSelectionIndex(getSelectionIndex());
  20.                         for (SelectionChangedListener listener : scls) {
  21.                             listener.selectionChanged(e);
  22.                         }
  23.                     }
  24.                 }
  25.             });
  26.         }
  27.         scls.add(listener);
  28.     }
  29.     public void add(String text) {
  30.         super.add(text);
  31.         indexData.add(null);
  32.     }
  33.     public void add(String text, int index) {
  34.         super.add(text, index);
  35.         if (index > indexData.size()) {
  36.             indexData.add(null);
  37.         } else {
  38.             indexData.set(index, null);
  39.         }
  40.     }
  41.     public void remove(int index) {
  42.         super.remove(index);
  43.         indexData.remove(index);
  44.     }
  45.     public void removeAll() {
  46.         super.removeAll();
  47.         indexData.clear();
  48.     }
  49.     /**
  50.      * 设置值,和setData(String,Object)不同的是,它是remove敏感的<br>
  51.      * 例如:0->A 1->B 2->C 如果删除1,那么 0->A 1->C<br>
  52.      * 所以可以使用一个链表存放object的值,当remove被调用时,此链表也被remove一个节点
  53.      * 
  54.      * @param index
  55.      * @param value
  56.      */
  57.     public void setIndexData(int index, Object value) {
  58.         indexData.set(index, value);
  59.     }
  60.     public Object getIndexData(int index) {
  61.         return indexData.get(index);
  62.     }
  63.     public void setState(ComboState state) {
  64.         this.state = state;
  65.     }
  66.     public ComboState getState() {
  67.         return this.state;
  68.     }
  69.     /**
  70.      * 注意,必须写一个空方法,不然会报exception
  71.      */
  72.     protected void checkSubclass() {
  73.     }
  74. }
最后是测试类:
  1. public class TestEasyCombo {
  2.     public static void main(String[] args) {
  3.         Display display = new Display();
  4.         Shell shell = new Shell(display);
  5.         shell.setText("测试窗口");
  6.         shell.setLayout(new FillLayout());
  7.         
  8.         EasyCombo combo = new EasyCombo(shell, SWT.READ_ONLY);
  9.         combo.add("test0");
  10.         combo.setIndexData(0"测试0");
  11.         combo.add("test1");
  12.         combo.setIndexData(1"测试1");
  13.         combo.add("test2");
  14.         combo.setIndexData(2"测试2");
  15.         
  16.         System.out.println("index: "+combo.getIndexData(1));
  17.         
  18.         combo.remove(1);
  19.         System.out.println("index: "+combo.getIndexData(1));
  20.         
  21.         
  22.         combo.addSelectionChangedListener(new SelectionChangedListener(){
  23.             public void selectionChanged(SelectionEvent event) {
  24.                 System.out.println("selection changed!");
  25.             }
  26.             
  27.         });
  28.         
  29.         shell.pack();
  30.         shell.open();
  31.         while (!shell.isDisposed()) {
  32.             if (!display.readAndDispatch())
  33.                 display.sleep();
  34.         }
  35.     }
  36. }
好了,新的类完成了。
它提供一个SelectionChangeEvent的事件,当你选中combo的一项,并且不是上次选择的那项时,SelectionChangeEvent才会被触发。此外,我可以根据index获得相相应的值了。

这么做只是解决问题的一种方法。如果不扩展Combo(eclipse建议不要继承swt widget),还有其它的解决方法。下文再写

 


 

分享到:
评论

相关推荐

    swt省市级联的绘制,年份的级联

    在SWT中,`Combo`控件通常用来创建下拉列表,而`CCombo`则是一个增强版的`Combo`,它支持文本编辑和下拉列表的结合。在实现省市级联和年份级联的过程中,我们通常会使用`CCombo`,因为它能提供更好的用户体验,允许...

    一个SWT日期时间选择控件类

    这个控件类可能是基于SWT的`Combo`或`Composite`组件进行扩展,以实现日期和时间的选择功能。通常,此类控件会包含两个部分:日期选择器和时间选择器,可能通过下拉菜单或者日历视图来展示。用户可以点击选择具体的...

    Swt的API使用说明

    Swt JFace库扩展了Swt,提供了数据绑定功能,使得模型和视图之间的数据同步变得更加简单。 **9. 打印支持** Swt API也支持打印功能,`Printer`和`PrintDialog`类可以用来创建和配置打印任务。 **10. 定时器和计时...

    SWT教程

    - 自定义控件:学习如何创建自定义的SWT控件,扩展SWT的功能。 通过本教程的学习,你将掌握SWT的核心概念,能够使用SWT和JFace构建功能丰富的Java GUI应用程序。实践是检验真理的唯一标准,建议在学习过程中不断...

    SWT开发参考文档

    - **Combo组件与List组件**:分别用于下拉列表和列表框。 - **Menu组件**:创建菜单栏和上下文菜单。 - **Toolbar组件**:创建工具栏。 - **Tray组件**:创建托盘图标。 - **Tree组件**:用于构建树形结构的数据展示...

    第6章 SWT概述

    3. **org.eclipse.swt.custom**: 包含了对标准组件的扩展,如CLabel可以同时显示文字和图片,以及StackLayout等新的布局方式。 4. **org.eclipse.swt.event**: 实现了事件处理机制,包括MouseListener、...

    eclipse-2019-64(集成SWT).zip

    6. 增强的插件系统,允许用户自定义工作区和扩展功能。 总的来说,"eclipse-2019-64(集成SWT).zip"是一个针对开发者的强大工具,提供了高效的GUI开发能力,结合64位系统的优化,为Java和其他语言的开发提供了卓越的...

    eclipse swt/jface核心应用

    1. **SWT组件**:包括按钮(Button)、文本框(Text)、列表(List)、表格(Table)、树形视图(Tree)、组合框(Combo)等。这些组件都有相应的事件监听器,如SelectionListener、ModifyListener,可以响应用户的...

    swt学习笔记摘录(入门程序)

    - **org.eclipse.swt.custom**: 扩展了一些基础组件,如CLabel(可同时显示文本和图像)和StackLayout(堆叠布局)。 - **org.eclipse.swt.event**: 提供事件处理机制,包括MouseListener、MouseMoveListener等监听...

    SWT 编 程 总 结

    - **GridData**:控制控件如何扩展或缩小以适应布局。 - **实例**:创建一个GridLayout,并设置每行和每列的宽度和高度。 ##### 8.4 FormLayout - **概述**:允许精确控制控件的位置。 - **按百分比放置控件**:...

    Eclipse_Swt_Jface_核心应用_部分19

    1.6.1 JFace是SWT的扩展 9 1.6.2 Eclipse的UI界面基于JFace 10 1.7 本章小结 10 第2章 配置SWT开发环境 11 2.1 下载和安装Eclipse 11 2.1.1 Eclipse下载页面介绍 11 2.1.2 下载Eclipse 12 2.1.3 安装...

    eclipse插件开发-铺设一条插件开发普及之路(1-5章).pdf

    - **SWT(Standard Widget Toolkit)**:是Eclipse项目的一个组成部分,提供了一套跨平台的GUI组件库,用于构建高性能的应用程序界面。 - **jFace**:基于SWT之上的一层高级组件库,提供了更高级别的抽象和功能,如...

    QQ设置界面---eclipse

    首先,我们需要了解SWT中的各种组件,如Button、Text、Combo、Checkbox等,它们对应于常见的用户界面元素,如按钮、文本框、下拉列表和复选框。在QQ设置界面中,这些组件可能会用于用户输入昵称、选择主题颜色、调整...

    Eclipse RCP教程

    #### 十二、JFace Combo Viewer 教程 - **实现**:展示如何使用JFace来创建一个组合框类型的视图。 #### 十三、字段辅助和控件装饰 - **字段辅助**:提供智能提示和代码补全功能。 - **控件装饰**:在界面上显示...

Global site tag (gtag.js) - Google Analytics