自定义SWT控件一之自定义单选下拉框

一、自定义下拉控件

  自定义的下拉框,是自定义样式的,其中的下拉框使用的是独立的window,非复选框的下拉框双击单机其它区域或选择完之后,独立window构成的下拉框会自动消失。

package com.view.control.select;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

import com.util.CollectionUtil;
import com.view.control.DefinedControl;
import com.view.swt.SWTResourceManager;
import com.view.swt.SWTUtil;

/**
 * <p>下拉框抽象类。该类主要实现了下拉框的绘制</p>
 * @version V1.0
 */
public abstract class DropDownBox<T> extends DefinedControl {
	
	protected Composite comboConenetComposite;
	/*****下拉框中的数据构成****/
	protected List<T> comboDataList;
	/*****下拉框每一行的高*******/
	protected int comboRowHeight  = 32;
	/*****下拉框每一行的宽******/
	protected int comboRowWidth = -1;
	protected List<Listener> selectListener;
	/******下拉控件的兄弟控件(绘制下拉框时,该控件必须存在)********/
	protected Composite contentComposite;
	/*****下拉框(gridLayout布局)******/
	protected Shell comboComposite;
	protected boolean showValue;
	
	/****
	 * <p>Combo数据对象</p>
	 * @version V1.0
	 */
	public static class Data{
		private String display;
		private String value;
		private int nickname;
		
		public Data(){
			
		}
		
		public Data(String display,String value){
			this.display = display;
			this.value = value;
		}
        public String getDisplay() {
        	return display;
        }
		
        public void setDisplay(String display) {
        	this.display = display;
        }
		
        public String getValue() {
        	return value;
        }
		
        public void setValue(String value) {
        	this.value = value;
        }

        public int getNickname() {
        	return nickname;
        }

        public void setNickname(int nickname) {
        	this.nickname = nickname;
        }

		@Override
        public int hashCode() {
	        final int prime = 31;
	        int result = 1;
	        result = prime * result + nickname;
	        result = prime * result + ((value == null)?0:value.hashCode());
	        return result;
        }

		@Override
        public boolean equals(Object obj) {
	        if (this == obj)
		        return true;
	        if (obj == null)
		        return false;
	        if (getClass() != obj.getClass())
		        return false;
	        Data other = (Data)obj;
	        if (nickname != other.nickname)
		        return false;
	        if (value == null) {
		        if (other.value != null)
			        return false;
	        } else if (!value.equals(other.value))
		        return false;
	        return true;
        }
	}
	public DropDownBox(Composite parent,List<T> comboDataList,int comboRowWidth) {
	    super(parent);
	    this.comboDataList = comboDataList;
	    this.comboRowWidth = comboRowWidth;
    }

	@Override
	public void paint() {
		generateComboComposite();
	}
	
	protected void comboPaint(){
		generateComboComposite();
	}
	
	/**
	 * 生成下拉框
	 */
	private void generateComboComposite(){
		 comboComposite = new Shell(this.contentComposite.getShell(),SWT.NO_TRIM);
		 comboComposite.setBackground(SWTResourceManager.getWhiteColor());
		 SWTUtil.paintBorder(comboComposite, SWTResourceManager.getDarkColor());
		 GridLayout gl = new GridLayout(); 
		 gl.marginBottom = 2; 
		 gl.marginTop = 2; 
		 gl.marginRight = 2; 
		 gl.marginLeft = 2; 
		 gl.marginWidth = 0; 
		 gl.marginHeight = 0; 
		comboComposite.setLayout(gl);
		comboComposite.addShellListener(new ShellAdapter() { 
			 public void shellDeactivated(ShellEvent arg0) { 
				 if (comboComposite != null && !comboComposite.isDisposed()) { 
					 comboComposite.dispose(); 
				 } 
			 } 
		 }); 
		reLocation();
		coverComboComposite();
		comboComposite.open(); 
	}
	
	protected void comboDispose(){
		if(!comboComposite.isDisposed()){
			comboComposite.dispose();
		}
	}
	
	/**
	 * 重新定位下拉框显示坐标
	 */
	public void reLocation(){
		if(comboComposite != null && !comboComposite.isDisposed()){
			if(null != contentComposite && !contentComposite.isDisposed()){
				Point p = contentComposite.getParent().toDisplay(contentComposite.getLocation()); 
				Point size = contentComposite.getSize(); 
				Rectangle shellRect = new Rectangle(p.x, p.y + size.y+5, size.x, 0); 
				comboComposite.setLocation(shellRect.x,shellRect.y);
			}else{
				comboComposite.setLocation(0, 0);
			}
		}
	}
	
	/**
	 * 可覆盖下拉框
	 */
	protected void coverComboComposite(){
		comboComposite.setSize(this.comboRowWidth+2, 180);
		ScrolledComposite scrolledComposite = new ScrolledComposite(comboComposite,SWT.V_SCROLL); 
		GridData gd_scrolledComposite = new GridData(SWT.FILL,SWT.FILL,true,true,1,1);
		scrolledComposite.setLayoutData(gd_scrolledComposite);
		scrolledComposite.setExpandHorizontal(true);
		scrolledComposite.setExpandVertical(true);
		
		comboConenetComposite = new Composite(scrolledComposite,SWT.NONE);
		GridLayout gl_comboComposite = new GridLayout(1,true);
		gl_comboComposite.horizontalSpacing = 0;
		gl_comboComposite.verticalSpacing = 0;
		gl_comboComposite.marginHeight = 1;
		gl_comboComposite.marginWidth = 1;
		comboConenetComposite.setLayout(gl_comboComposite);
		comboConenetComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
		scrolledComposite.setContent(comboConenetComposite);
		
		if(CollectionUtil.isNotEmpty(this.comboDataList)){
			if(this.comboDataList.size()<=8){
				comboComposite.setSize(this.comboRowWidth+2, this.comboRowHeight * this.comboDataList.size()+10);
			}
			for(T data:this.comboDataList){
				generateComboItem(data);
			}
		}else{
			comboComposite.setSize(this.comboRowWidth, this.comboRowHeight);
		}
		comboConenetComposite.layout(true);
		scrolledComposite.setMinSize(comboConenetComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
	}
	
	/**
	 * 创建一个item
	 * @param display
	 * @param value
	 * @param index
	 */
	protected void generateComboItem(T data){
		Composite itemComposite = new Composite(comboConenetComposite,SWT.NONE);
		itemComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
		GridData gd_itemComposite = new GridData(SWT.FILL,SWT.FILL,false,false,1,1);
		gd_itemComposite.heightHint = this.comboRowHeight;
		gd_itemComposite.widthHint = this.comboRowWidth-20;
		itemComposite.setLayoutData(gd_itemComposite);
		generateComboItemComposite(data,itemComposite);
		itemComposite.setData("data", data);
	}

    public void addSelectListener(Listener selectListener) {
    	if(this.selectListener == null){
    		this.selectListener = new ArrayList<Listener>();
    	}
    	this.selectListener.add(selectListener);
    }
    
   
    protected List<Listener> getSelectListener() {
    	return selectListener;
    }

  /**
     * 生成一行
     * @param data
     * @param itemComposite
     */
    protected abstract void generateComboItemComposite(T data,Composite itemComposite);
	
    public int getComboRowHeight() {
    	return comboRowHeight;
    }
	
    public void setComboRowHeight(int comboRowHeight) {
    	this.comboRowHeight = comboRowHeight;
    }
	
    public int getComboRowWidth() {
    	return comboRowWidth;
    }
	
    public void setComboRowWidth(int comboRowWidth) {
    	this.comboRowWidth = comboRowWidth;
    }
	
    public Composite getComboComposite() {
    	return comboComposite;
    }

    public List<T> getComboDataList() {
    	return comboDataList;
    }
    
    public void addData(T data){
    	this.comboDataList.add(data);
    }
    
    public void removeData(Data data){
    	this.comboDataList.remove(data);
    }

    public void setComboDataList(List<T> comboDataList) {
    	this.comboDataList = comboDataList;
    }

    public boolean isShowValue() {
    	return showValue;
    }

    public void setShowValue(boolean showValue) {
    	this.showValue = showValue;
    }
    
    public void dispose(){
    	if(comboComposite!= null && !comboComposite.isDisposed()){
    		comboComposite.dispose();
    	}
    }

    public void setContentComposite(Composite contentComposite) {
    	this.contentComposite = contentComposite;
    }

    public Composite getContentComposite() {
    	return contentComposite;
    }
}

 DropDownBox.java  是所有下拉框(单选下拉框、复选下拉框)的基础类。

package com.view.control;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

import org.apache.commons.collections.map.MultiValueMap;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;

import com.util.CollectionUtil;
import com.util.StringUtil;
import com.view.control.valid.DefinedValidListener;
import com.view.control.valid.IValid;
import com.view.control.valid.RequiredValid;
import com.view.swt.SWTResourceManager;
import com.view.swt.SWTUtil;


public abstract class DefinedFormControl extends DefinedControl {
    protected boolean require;
    /****提示信息********/
    protected Label mention;
     /*****校验结果,值为true,表示校验通过****/
    protected boolean validResult = true;
    /*****默认提示,主要显示error区域*****/
    protected String defaultMention;
    protected MultiValueMap validlisteners = MultiValueMap.decorate(new HashMap<Integer,IValid>());
    protected Composite validControl;
    protected int mentionWidth = 0;
    public DefinedFormControl(Composite parent) {
        super(parent);
    }
    
    public boolean notifyValid(){    
        if(!require && CollectionUtil.isEmpty(validlisteners)){
            return true;
        }
        notifyRequired(getValue());
        if(validResult && CollectionUtil.isNotMultiEmpty(validlisteners)){
            @SuppressWarnings("unchecked")
            Set<Integer> keySet = validlisteners.keySet();
            Event event = new Event();
            event.widget = validControl;
            MultiValueMap excludeListener = MultiValueMap.decorate(new HashMap<Integer,Listener>(), ArrayList.class);
            for(Integer key:keySet){
                if(CollectionUtil.isNotEmpty(validlisteners.getCollection(key))){
                    if(validResult){
                        Listener[] listeners = validControl.getListeners(key);
                        for(Listener listener:listeners){
                            if(!(listener instanceof DefinedValidListener)){
                                excludeListener.put(key, listener);
                                validControl.removeListener(key, listener);
                            }
                        }
                        validControl.notifyListeners(key, event);
                    }
                }
            }
            if(CollectionUtil.isNotEmpty(excludeListener)){
                for(Object key:excludeListener.keySet()){
                    for(Object listener:excludeListener.getCollection(key)){
                        validControl.addListener((Integer)key, (Listener)listener);
                    }
                }
            }
        }
        if(validResult){
            
        }
        return validResult;
    }
    
    public abstract String getValue();
    public abstract Composite getMentionComposite();
    
    protected void notifyRequired(String value){
        if(require && validResult){
            RequiredValid valid = new RequiredValid();
            String message = valid.valid(value);
            if(StringUtil.isNotNullAndEmpty(message)){
                showErrorMention(message,getMentionComposite());
            }else{
                showNormalMention(getMentionComposite());
            }
        }
    }
    
    /**
     * 显示错误信息
     * @author wangfang5 2018年1月6日 下午9:23:38
     * @param errorText
     */
    protected void showErrorMention(String errorText,Composite contentComposite){
        if(contentComposite != null) {
            SWTUtil.changeBorderToRed(contentComposite);
        }
        mention.setText(errorText);
        mention.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
        mention.getParent().layout(true);
        validResult = false;
    }

    /**
     * 显示默认提示
     * @author wangfang5 2018年1月9日 下午2:27:16
     */
    protected void showNormalMention(Composite contentComposite){
        if(contentComposite != null) {
            SWTUtil.changeBorderToNormal(contentComposite);
        }
        if(StringUtil.isNotNullAndEmpty(defaultMention)){
            mention.setForeground(SWTResourceManager.getColor(200,200,200));
            mention.setText(defaultMention);
        }else{
            mention.setText(StringUtils.EMPTY);
        }
        mention.getParent().layout(true);
        validResult = true;
    }
    
    public void setRequire(boolean require) {
        this.require = require;
    }

    public void setDefaultMention(String defaultMention) {
        this.defaultMention = defaultMention;
    }

    public void setMentionWidth(int mentionWidth) {
        this.mentionWidth = mentionWidth;
    }
}

DefinedFormControl.java 抽象表单控件

package com.view.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.batik.transcoder.TranscoderException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Display;

public class ImageUtil {
    
    public static Image getImage(String filePath) {
        ImageLoader loader = new ImageLoader();
        ImageData[] imageData = null;
        if(filePath.endsWith("svg") || filePath.endsWith("SVG")){
            imageData = getImageSvg(filePath, loader);
        }else{
            try {
                imageData = loader.load(filePath);
            } catch (SWTException e) {
                return null;
            }
        }
        Image newImage = null;
        if (imageData.length > 0) {
            newImage = new Image(null, imageData[0]);
        }
        return newImage;
    }
    
    public static ImageData[] getImageDatas(String filePath) {
        ImageLoader loader = new ImageLoader();
        ImageData[] imageData = null;
        if(filePath.endsWith("svg") || filePath.endsWith("SVG")){
            imageData = getImageSvg(filePath, loader);
        }else{
            try {
                imageData = loader.load(filePath);
            } catch (SWTException e) {
                return null;
            }
        }
        return imageData;
    }

    private static ImageData[] getImageSvg(String filePath, ImageLoader loader) {
        ImageData[] imageData;
        String path = filePath.substring(0, filePath.lastIndexOf(".")) + ".png";
        File file = new File(path);
        Map<String, String> map = new HashMap<String, String>();
        FileOutputStream outputStream = null;
        try {
            file.createNewFile();
            outputStream = new FileOutputStream(file);
        } catch (IOException e1) {
        }
        try {
            SvgPngConverter.convertToPngByFile(filePath, outputStream, map);
        } catch (TranscoderException | IOException e1) {
        }
        imageData = loader.load(path);
        file.delete();
        return imageData;
    }
    
    public static Image getImage(InputStream imageInputStream) {
        ImageLoader loader = new ImageLoader();
        ImageData[] imageData = loader.load(imageInputStream);
        Image newImage = null;
        if (imageData.length > 0) {
            newImage = new Image(null, imageData[0]);
        }
        return newImage;
    }
    
    public static Image getImage(String filePath, int width, int height) {
        Image scaled = new Image(Display.getDefault(), width, height);
        Image src = getImage(filePath);
        if (src == null) {
            return null;
        }
        GC gc = new GC(scaled);
        try {
            gc.setAdvanced(true); // 打开高级绘图模式
            gc.setAntialias(SWT.ON);// 设置消除锯齿
            gc.setInterpolation(SWT.HIGH); // 设置插值
            gc.drawImage(src, 0, 0, src.getBounds().width, src.getBounds().height, 0, 0, width, height);
        } finally {
            gc.dispose();
        }
        return scaled;
        
    }
    
    public static Image getImage(InputStream imageInputStream, int width, int height) {
        Image scaled = new Image(Display.getDefault(), width, height);
        Image src = getImage(imageInputStream);
        GC gc = new GC(scaled);
        try {
            gc.setAdvanced(true); // 打开高级绘图模式
            gc.setAntialias(SWT.ON);// 设置消除锯齿
            gc.setInterpolation(SWT.HIGH); // 设置插值
            gc.drawImage(src, 0, 0, src.getBounds().width, src.getBounds().height, 0, 0, width, height);
        } finally {
            gc.dispose();
        }
        return scaled;
    }
}

ImageUtil.java 图像相关工具类

/*******************************************************************************
 * Copyright (c) 2011 Google, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Google, Inc. - initial API and implementation
 *******************************************************************************/
package com.view.swt;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;

/**
 * Utility class for managing OS resources associated with SWT controls such as colors, fonts, images, etc.
 * <p>
 * !!! IMPORTANT !!! Application code must explicitly invoke the <code>dispose()</code> method to release the
 * operating system resources managed by cached objects when those objects and OS resources are no longer
 * needed (e.g. on application shutdown)
 * <p>
 * This class may be freely distributed as part of any application or plugin.
 * <p>
 * @author scheglov_ke
 * @author Dan Rubel
 */
public class SWTResourceManager {
    ////////////////////////////////////////////////////////////////////////////
    //
    // Color
    //
    ////////////////////////////////////////////////////////////////////////////
    private static Map<RGB, Color> m_colorMap = new HashMap<RGB, Color>();
    /**
     * Returns the system {@link Color} matching the specific ID.
     * 
     * @param systemColorID
     *            the ID value for the color
     * @return the system {@link Color} matching the specific ID
     */
    public static Color getColor(int systemColorID) {
        Display display = Display.getCurrent();
        return display.getSystemColor(systemColorID);
    }
    
    /**
     * 获取border边框颜色
     * @author wangfang5 2017年10月21日 下午1:32:01
     * @return
     */
    public static Color getBorderColor(){
        return getColor(new RGB(199,199,199));  
    }
    
    /**
     * 获取浅灰色border边框颜色
     * @author wangfang5 2018年5月22日 下午2:26:08
     * @return
     */
    public static Color getLightGreyBorderColor(){
        return getColor(new RGB(229,229,229));  
    }
    
    /**
     * 获取较深的边框颜色
     * @author wangfang5 2018年1月27日 下午2:35:39
     * @return
     */
    public static Color getDarkColor(){
        return getColor(new RGB(199,199,199));
    }
    
    /**
     * 默认的字体颜色
     * @author wangfang5 2018年1月29日 下午5:42:26
     * @return
     */
    public static Color getTextColor(){
        return getColor(new RGB(51,51,51));
    }
    
    /**
     * 获取白
     * @author wangfang5 2018年1月29日 下午6:49:36
     * @return
     */
    public static Color getWhiteColor(){
        return getColor(new RGB(255,255,255));
    }
    
    /**
     * 获取控件边框颜色
     * @author wangfang5 2018年1月12日 下午12:01:12
     * @return
     */
    public static Color getControlBorderColor(){
        return getColor(new RGB(204,204,204));
    }
    /**
     * Returns a {@link Color} given its red, green and blue component values.
     * 
     * @param r
     *            the red component of the color
     * @param g
     *            the green component of the color
     * @param b
     *            the blue component of the color
     * @return the {@link Color} matching the given red, green and blue component values
     */
    public static Color getColor(int r, int g, int b) {
        return getColor(new RGB(r, g, b));
    }
    /**
     * Returns a {@link Color} given its RGB value.
     * 
     * @param rgb
     *            the {@link RGB} value of the color
     * @return the {@link Color} matching the RGB value
     */
    public static Color getColor(RGB rgb) {
        Color color = m_colorMap.get(rgb);
        if (color == null) {
            Display display = Display.getCurrent();
            color = new Color(display, rgb);
            m_colorMap.put(rgb, color);
        }
        return color;
    }
    /**
     * Dispose of all the cached {@link Color}'s.
     */
    public static void disposeColors() {
        for (Color color : m_colorMap.values()) {
            color.dispose();
        }
        m_colorMap.clear();
    }
    ////////////////////////////////////////////////////////////////////////////
    //
    // Image
    //
    ////////////////////////////////////////////////////////////////////////////
    /**
     * Maps image paths to images.
     */
    private static Map<String, Image> m_imageMap = new HashMap<String, Image>();
    /**
     * Returns an {@link Image} encoded by the specified {@link InputStream}.
     * 
     * @param stream
     *            the {@link InputStream} encoding the image data
     * @return the {@link Image} encoded by the specified input stream
     */
    protected static Image getImage(InputStream stream) throws IOException {
        try {
            Display display = Display.getCurrent();
            ImageData data = new ImageData(stream);
            if (data.transparentPixel > 0) {
                return new Image(display, data, data.getTransparencyMask());
            }
            return new Image(display, data);
        } finally {
            stream.close();
        }
    }
    /**
     * Returns an {@link Image} stored in the file at the specified path.
     * 
     * @param path
     *            the path to the image file
     * @return the {@link Image} stored in the file at the specified path
     */
    public static Image getImage(String path) {
        Image image = m_imageMap.get(path);
        if (image == null) {
            try {
                image = getImage(new FileInputStream(path));
                m_imageMap.put(path, image);
            } catch (Exception e) {
                image = getMissingImage();
                m_imageMap.put(path, image);
            }
        }
        return image;
    }
    /**
     * Returns an {@link Image} stored in the file at the specified path relative to the specified class.
     * 
     * @param clazz
     *            the {@link Class} relative to which to find the image
     * @param path
     *            the path to the image file, if starts with <code>'/'</code>
     * @return the {@link Image} stored in the file at the specified path
     */
    public static Image getImage(Class<?> clazz, String path) {
        String key = clazz.getName() + '|' + path;
        Image image = m_imageMap.get(key);
        if (image == null) {
            try {
                image = getImage(clazz.getResourceAsStream(path));
                m_imageMap.put(key, image);
            } catch (Exception e) {
                image = getMissingImage();
                m_imageMap.put(key, image);
            }
        }
        return image;
    }
    private static final int MISSING_IMAGE_SIZE = 10;
    /**
     * @return the small {@link Image} that can be used as placeholder for missing image.
     */
    private static Image getMissingImage() {
        Image image = new Image(Display.getCurrent(), MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);
        //
        GC gc = new GC(image);
        gc.setBackground(getColor(SWT.COLOR_RED));
        gc.fillRectangle(0, 0, MISSING_IMAGE_SIZE, MISSING_IMAGE_SIZE);
        gc.dispose();
        //
        return image;
    }
    /**
     * Style constant for placing decorator image in top left corner of base image.
     */
    public static final int TOP_LEFT = 1;
    /**
     * Style constant for placing decorator image in top right corner of base image.
     */
    public static final int TOP_RIGHT = 2;
    /**
     * Style constant for placing decorator image in bottom left corner of base image.
     */
    public static final int BOTTOM_LEFT = 3;
    /**
     * Style constant for placing decorator image in bottom right corner of base image.
     */
    public static final int BOTTOM_RIGHT = 4;
    /**
     * Internal value.
     */
    protected static final int LAST_CORNER_KEY = 5;
    /**
     * Maps images to decorated images.
     */
    @SuppressWarnings("unchecked")
    private static Map<Image, Map<Image, Image>>[] m_decoratedImageMap = new Map[LAST_CORNER_KEY];
    /**
     * Returns an {@link Image} composed of a base image decorated by another image.
     * 
     * @param baseImage
     *            the base {@link Image} that should be decorated
     * @param decorator
     *            the {@link Image} to decorate the base image
     * @return {@link Image} The resulting decorated image
     */
    public static Image decorateImage(Image baseImage, Image decorator) {
        return decorateImage(baseImage, decorator, BOTTOM_RIGHT);
    }
    /**
     * Returns an {@link Image} composed of a base image decorated by another image.
     * 
     * @param baseImage
     *            the base {@link Image} that should be decorated
     * @param decorator
     *            the {@link Image} to decorate the base image
     * @param corner
     *            the corner to place decorator image
     * @return the resulting decorated {@link Image}
     */
    public static Image decorateImage(final Image baseImage, final Image decorator, final int corner) {
        if (corner <= 0 || corner >= LAST_CORNER_KEY) {
            throw new IllegalArgumentException("Wrong decorate corner");
        }
        Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[corner];
        if (cornerDecoratedImageMap == null) {
            cornerDecoratedImageMap = new HashMap<Image, Map<Image, Image>>();
            m_decoratedImageMap[corner] = cornerDecoratedImageMap;
        }
        Map<Image, Image> decoratedMap = cornerDecoratedImageMap.get(baseImage);
        if (decoratedMap == null) {
            decoratedMap = new HashMap<Image, Image>();
            cornerDecoratedImageMap.put(baseImage, decoratedMap);
        }
        //
        Image result = decoratedMap.get(decorator);
        if (result == null) {
            Rectangle bib = baseImage.getBounds();
            Rectangle dib = decorator.getBounds();
            //
            result = new Image(Display.getCurrent(), bib.width, bib.height);
            //
            GC gc = new GC(result);
            gc.drawImage(baseImage, 0, 0);
            if (corner == TOP_LEFT) {
                gc.drawImage(decorator, 0, 0);
            } else if (corner == TOP_RIGHT) {
                gc.drawImage(decorator, bib.width - dib.width, 0);
            } else if (corner == BOTTOM_LEFT) {
                gc.drawImage(decorator, 0, bib.height - dib.height);
            } else if (corner == BOTTOM_RIGHT) {
                gc.drawImage(decorator, bib.width - dib.width, bib.height - dib.height);
            }
            gc.dispose();
            //
            decoratedMap.put(decorator, result);
        }
        return result;
    }
    /**
     * Dispose all of the cached {@link Image}'s.
     */
    public static void disposeImages() {
        // dispose loaded images
        {
            for (Image image : m_imageMap.values()) {
                image.dispose();
            }
            m_imageMap.clear();
        }
        // dispose decorated images
        for (int i = 0; i < m_decoratedImageMap.length; i++) {
            Map<Image, Map<Image, Image>> cornerDecoratedImageMap = m_decoratedImageMap[i];
            if (cornerDecoratedImageMap != null) {
                for (Map<Image, Image> decoratedMap : cornerDecoratedImageMap.values()) {
                    for (Image image : decoratedMap.values()) {
                        image.dispose();
                    }
                    decoratedMap.clear();
                }
                cornerDecoratedImageMap.clear();
            }
        }
    }
    ////////////////////////////////////////////////////////////////////////////
    //
    // Font
    //
    ////////////////////////////////////////////////////////////////////////////
    /**
     * Maps font names to fonts.
     */
    private static Map<String, Font> m_fontMap = new HashMap<String, Font>();
    /**
     * Maps fonts to their bold versions.
     */
    private static Map<Font, Font> m_fontToBoldFontMap = new HashMap<Font, Font>();
    /**
     * Returns a {@link Font} based on its name, height and style.
     * 
     * @param name
     *            the name of the font
     * @param height
     *            the height of the font
     * @param style
     *            the style of the font
     * @return {@link Font} The font matching the name, height and style
     */
    public static Font getFont(String name, int height, int style) {
        return getFont(name, height, style, false, false);
    }
    /**
     * Returns a {@link Font} based on its name, height and style. Windows-specific strikeout and underline
     * flags are also supported.
     * 
     * @param name
     *            the name of the font
     * @param size
     *            the size of the font
     * @param style
     *            the style of the font
     * @param strikeout
     *            the strikeout flag (warning: Windows only)
     * @param underline
     *            the underline flag (warning: Windows only)
     * @return {@link Font} The font matching the name, height, style, strikeout and underline
     */
    public static Font getFont(String name, int size, int style, boolean strikeout, boolean underline) {
        String fontName = name + '|' + size + '|' + style + '|' + strikeout + '|' + underline;
        Font font = m_fontMap.get(fontName);
        if (font == null) {
            FontData fontData = new FontData(name, size, style);
            if (strikeout || underline) {
                try {
                    Class<?> logFontClass = Class.forName("org.eclipse.swt.internal.win32.LOGFONT"); //$NON-NLS-1$
                    Object logFont = FontData.class.getField("data").get(fontData); //$NON-NLS-1$
                    if (logFont != null && logFontClass != null) {
                        if (strikeout) {
                            logFontClass.getField("lfStrikeOut").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$
                        }
                        if (underline) {
                            logFontClass.getField("lfUnderline").set(logFont, Byte.valueOf((byte) 1)); //$NON-NLS-1$
                        }
                    }
                } catch (Throwable e) {
                    System.err.println("Unable to set underline or strikeout" + " (probably on a non-Windows platform). " + e); //$NON-NLS-1$ //$NON-NLS-2$
                }
            }
            font = new Font(Display.getCurrent(), fontData);
            m_fontMap.put(fontName, font);
        }
        return font;
    }
    /**
     * Returns a bold version of the given {@link Font}.
     * 
     * @param baseFont
     *            the {@link Font} for which a bold version is desired
     * @return the bold version of the given {@link Font}
     */
    public static Font getBoldFont(Font baseFont) {
        Font font = m_fontToBoldFontMap.get(baseFont);
        if (font == null) {
            FontData fontDatas[] = baseFont.getFontData();
            FontData data = fontDatas[0];
            font = new Font(Display.getCurrent(), data.getName(), data.getHeight(), SWT.BOLD);
            m_fontToBoldFontMap.put(baseFont, font);
        }
        return font;
    }
    /**
     * Dispose all of the cached {@link Font}'s.
     */
    public static void disposeFonts() {
        // clear fonts
        for (Font font : m_fontMap.values()) {
            font.dispose();
        }
        m_fontMap.clear();
        // clear bold fonts
        for (Font font : m_fontToBoldFontMap.values()) {
            font.dispose();
        }
        m_fontToBoldFontMap.clear();
    }
    ////////////////////////////////////////////////////////////////////////////
    //
    // Cursor
    //
    ////////////////////////////////////////////////////////////////////////////
    /**
     * Maps IDs to cursors.
     */
    private static Map<Integer, Cursor> m_idToCursorMap = new HashMap<Integer, Cursor>();
    /**
     * Returns the system cursor matching the specific ID.
     * 
     * @param id
     *            int The ID value for the cursor
     * @return Cursor The system cursor matching the specific ID
     */
    public static Cursor getCursor(int id) {
        Integer key = Integer.valueOf(id);
        Cursor cursor = m_idToCursorMap.get(key);
        if (cursor == null) {
            cursor = new Cursor(Display.getDefault(), id);
            m_idToCursorMap.put(key, cursor);
        }
        return cursor;
    }
    /**
     * Dispose all of the cached cursors.
     */
    public static void disposeCursors() {
        for (Cursor cursor : m_idToCursorMap.values()) {
            cursor.dispose();
        }
        m_idToCursorMap.clear();
    }
    ////////////////////////////////////////////////////////////////////////////
    //
    // General
    //
    ////////////////////////////////////////////////////////////////////////////
    /**
     * Dispose of cached objects and their underlying OS resources. This should only be called when the cached
     * objects are no longer needed (e.g. on application shutdown).
     */
    public static void dispose() {
        disposeColors();
        disposeImages();
        disposeFonts();
        disposeCursors();
    }
}

1、自定义单选下拉框

package com.view.control.select;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;

import com.util.CollectionUtil;
import com.util.FileUtil;
import com.view.control.DefinedControl;
import com.view.control.select.DropDownBox.Data;
import com.view.swt.SWTResourceManager;
import com.view.swt.SWTUtil;
import com.util.ImageUtil;

/**
 * <p>不可编辑下拉框</p>
 * @version V1.0
 */
public class DefinedCommonSingleSelect extends DefinedControl {
    /****内容框容器的宽度****/
    private int comboWidth = 323;
    /****内容框容器的高度*****/
    private int comboHeight = 32;
    /****内容框容器*****/
    private CLabel contentText;
    private Label img;
    private DropDownBox.Data defaultValue;
    private boolean enable = true;
    private boolean showValue=false;
    private DropDownBox<DropDownBox.Data> dropDownBox;
    private DefinedCommonSingleSelectEvent dropdownBeforeEvent;
    private Composite contentComposite;
    
    public DefinedCommonSingleSelect(Composite parent, DropDownBox<DropDownBox.Data> dropDownBox) {
        super(parent);
        this.dropDownBox = dropDownBox;
    }
    
    public DefinedCommonSingleSelect(Composite parent,DropDownBox<DropDownBox.Data> dropDownBox,int comboWidth,int comboHeight) {
        this(parent,dropDownBox);
        this.comboWidth = comboWidth;
        this.comboHeight = comboHeight;
    }
    
    public DefinedCommonSingleSelect(Composite parent,DropDownBox<DropDownBox.Data> dropDownBox,int comboWidth,int comboHeight,boolean showValue) {
        this(parent,dropDownBox,comboWidth,comboHeight);
        this.showValue=showValue;
    }

    @Override
    public void paint() {
        contentText = generateComposite(this.parent);
        if(null != this.defaultValue){
            if(showValue){
                contentText.setText(defaultValue.getDisplay()+"_"+ defaultValue.getValue());
            }
            else{
                contentText.setText(defaultValue.getDisplay());
            }                
            contentText.setData("value", this.defaultValue.getValue());
            contentText.setData("data", defaultValue);
        }
        this.parent.layout(true);
    }

    /**
     * 创建文本框控件
     * @param parentComposite
     * @return
     */
    private CLabel generateComposite(Composite parentComposite){
        contentComposite = new Composite(parentComposite, SWT.NONE);
        GridData gd_contentComposite = new GridData(SWT.FILL,SWT.FILL,false,false,1,1);
        gd_contentComposite.widthHint = this.comboWidth;
        gd_contentComposite.heightHint = this.comboHeight;
        contentComposite.setLayoutData(gd_contentComposite);
        GridLayout grid = new GridLayout(2, false);
        grid.horizontalSpacing = 1;
        grid.verticalSpacing = 0;
        grid.marginHeight = 1;
        grid.marginWidth = 1;
        contentComposite.setLayout(grid);
        contentComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        SWTUtil.paintBorder(contentComposite, SWTResourceManager.getColor(229,229,229));
        
        CLabel contentText = new CLabel(contentComposite,SWT.NONE);
        GridData gd_contentText = new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1);
        contentText.setLayoutData(gd_contentText);    
        contentText.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        
        img = new Label(contentComposite, SWT.NONE);
        GridData gd_img = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_img.widthHint = 24;
        gd_img.heightHint = 24;
        img.setLayoutData(gd_img);
        img.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream("images/h-icon-angle-minimum-down.png")));
        img.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        img.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
        img.addListener(SWT.MouseDown, new Listener(){
            @Override
            public void handleEvent(Event event) {
                boolean addImgEvent = true;
                if(null != dropdownBeforeEvent){
                    addImgEvent = dropdownBeforeEvent.dropdownBeforeEvent();//展现下拉框之前的操作行为 
                }
                if(addImgEvent){
                    //绘制下拉框
                    Composite comboComposite = dropDownBox.getComboComposite();
                    if(comboComposite !=null && !comboComposite.isDisposed()){
                        dropDownBox.comboDispose();
                    }else{
                        dropDownBox.setContentComposite(contentComposite);
                        dropDownBox.comboPaint();
                    }
                }
            }
        });
        img.setEnabled(this.enable);
        contentComposite.layout(true);
        return contentText;
    }
    
    protected void generateComboItemComposite(Data data, Composite itemComposite) {
        GridLayout gl_itemComposite = new GridLayout(1,true);
        gl_itemComposite.verticalSpacing = 0;
        gl_itemComposite.horizontalSpacing = 0;
        gl_itemComposite.marginHeight = 0;
        gl_itemComposite.marginWidth = 10;
        itemComposite.setLayout(gl_itemComposite);
        CLabel itemLabel = new CLabel(itemComposite,SWT.NONE);
        itemLabel.setData("data",data);
        itemLabel.setAlignment(SWT.LEFT);
        GridData gd_itemLabel = new GridData(SWT.FILL,SWT.FILL,true,false,1,1);
        itemLabel.setLayoutData(gd_itemLabel);
        if(data != null){
            if(showValue){
                itemLabel.setText(data.getDisplay()+"_"+data.getValue());
            }
            else{
                itemLabel.setText(data.getDisplay());
            }
        }
        itemLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        itemLabel.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
        
        itemLabel.addListener(SWT.MouseEnter, new Listener(){
            @Override
            public void handleEvent(Event event) {
                changeItemSelection(itemLabel);
            }
        });
        itemLabel.addListener(SWT.MouseExit, new Listener(){
            @Override
            public void handleEvent(Event event) {
                changeItemUnSelection(itemLabel);
            }
        });
        itemLabel.addListener(SWT.MouseDown, new Listener(){
            @Override
            public void handleEvent(Event event) {
                if(null == dropdownBeforeEvent || dropdownBeforeEvent.selectBeforeEvent(data)){
                    contentText.setText(data.getDisplay());
                    contentText.setData("value", data.getValue());
                    contentText.setData("data", data);
                    if(CollectionUtil.isNotEmpty(dropDownBox.getSelectListener())){
                        for(Listener listener:dropDownBox.getSelectListener()){
                            event.data = data;
                            listener.handleEvent(event);
                        }
                    }
                }
                Composite comboComposite = dropDownBox.getComboComposite();
                if(comboComposite !=null && !comboComposite.isDisposed()){
                    dropDownBox.comboDispose();
                }
            }
        });
    }
    
    private void changeItemSelection(CLabel itemLabel){
        itemLabel.getParent().setBackground(SWTResourceManager.getColor(110,154,255));
        itemLabel.setBackground(SWTResourceManager.getColor(110,154,255));
        itemLabel.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    }
    
    private void changeItemUnSelection(CLabel itemLabel){
        itemLabel.getParent().setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        itemLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        itemLabel.setForeground(SWTResourceManager.getColor(51,51,51));
    }
    
    public String getValue(){
        return (String)this.contentText.getData("value");
    }
    
    /**
     * 清除当前选择*/
    public void clearValue(){
        this.contentText.setText(StringUtils.EMPTY);
        this.contentText.setData("value", null);
        this.contentText.setData("data", null);
    }

    public int getComboWidth() {
        return comboWidth;
    }

    public void setComboWidth(int comboWidth) {
        this.comboWidth = comboWidth;
    }

    public int getComboHeight() {
        return comboHeight;
    }
    
    public void setComboHeight(int comboHeight) {
        this.comboHeight = comboHeight;
    }

    public DropDownBox.Data getDefaultValue() {
        return defaultValue;
    }
    
    /**
     * 获取当前输入框呈现的值
     * @return
     */
    public DropDownBox.Data getDataValue(){
        return (DropDownBox.Data)this.contentText.getData("data");
    }

    public void setDefaultValue(DropDownBox.Data defaultValue) {
        this.defaultValue = defaultValue;
    }
    
    public void setDefaultValue(String defaultValue) {
        this.defaultValue = new DropDownBox.Data(defaultValue,defaultValue);
    }

    public CLabel getContentText() {
        return contentText;
    }

    public Label getImg() {
        return img;
    }

    public Composite getContentComposite() {
        return contentComposite;
    }
    
    /**
     * 设置下拉框是否是可用状态
     * @param enable
     */
    public void setEnabel(boolean enable){
        if(img != null && !img.isDisposed()){
            this.enable = enable;
            img.setEnabled(enable);
        }
    }

    public void setDropdownBeforeEvent(DefinedCommonSingleSelectEvent dropdownBeforeEvent) {
        this.dropdownBeforeEvent = dropdownBeforeEvent;
    }


    /**
     * <p>通用的接口形式</p>
     * @version V1.0
     */
    public interface DefinedCommonSingleSelectEvent{
        /**
         * 打开下拉框之前的操作
         * @return
         */
        boolean dropdownBeforeEvent();
        /**
         * 下拉可选之前的操作行为,只有在为true的时候,选择的数据才会生效
         * @return
         */
        boolean selectBeforeEvent(DropDownBox.Data data);
    }
    
    public boolean isShowValue() {
        return showValue;
    }

    public void setShowValue(boolean showValue) {
        this.showValue = showValue;
    }
}

DefinedCommonSingleSelect.java 为所有单选(可编辑下拉框、不可编辑下拉框)下拉框的公共部分。

1.1 不可编辑下拉框 ( DefinedSingleSelect.java )(一个输入框 + 一个下拉弹出框)

package com.view.control.select;

import java.util.List;

import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;

import com.view.control.select.DefinedCommonSingleSelect.DefinedCommonSingleSelectEvent;

/**
 * <p>不可编辑下拉框,parent为绝对布局</p>
 * @version V1.0
 */
public class DefinedSingleSelect extends DropDownBox<DropDownBox.Data> {
    private DefinedCommonSingleSelect commonSingleSelect;
    
    public DefinedSingleSelect(Composite parent, List<Data> comboDataList, int comboRowWidth) {
        super(parent, comboDataList, comboRowWidth);
        commonSingleSelect = new DefinedCommonSingleSelect(parent,this);
    }
    
    public DefinedSingleSelect(Composite parent,List<Data> comboDataList,int comboWidth,int comboHeight) {
        this(parent,comboDataList,comboWidth);
        commonSingleSelect = new DefinedCommonSingleSelect(parent,this,comboWidth,comboHeight);
    }
    
    public DefinedSingleSelect(Composite parent,List<Data> comboDataList,int comboWidth,int comboHeight,boolean showValue) {
         this(parent,comboDataList,comboWidth);
         commonSingleSelect = new DefinedCommonSingleSelect(parent,this,comboWidth,comboHeight,showValue);
    }
    
    @Override
    public void paint(){
        commonSingleSelect.paint();
    }
    
    @Override
    protected void generateComboItemComposite(Data data, Composite itemComposite) {
        commonSingleSelect.generateComboItemComposite(data, itemComposite);
    }

    public String getValue(){
        return commonSingleSelect.getValue();
    }
    
    /**
     * 清除当前选择*/
    public void clearValue(){
        commonSingleSelect.clearValue();
    }

    public int getComboWidth() {
        return commonSingleSelect.getComboWidth();
    }

    public void setComboWidth(int comboWidth) {
        commonSingleSelect.setComboWidth(comboWidth);
    }

    public int getComboHeight() {
        return commonSingleSelect.getComboHeight();
    }
    
    public void setComboHeight(int comboHeight) {
        commonSingleSelect.setComboHeight(comboHeight);
    }

    public DropDownBox.Data getDefaultValue() {
        return commonSingleSelect.getDefaultValue();
    }

    public void setDefaultValue(DropDownBox.Data defaultValue) {
        commonSingleSelect.setDefaultValue(defaultValue);
    }

    public CLabel getContentText() {
        return commonSingleSelect.getContentText();
    }

    public Label getImg() {
        return commonSingleSelect.getImg();
    }

    public Composite getContentComposite() {
        return commonSingleSelect.getContentComposite();
    }
    
    /**
     * 设置下拉框是否是可用状态
     * @param enable
     */
    public void setEnabel(boolean enable){
        commonSingleSelect.setEnabel(enable);
    }

    public void setDropdownBeforeEvent(DefinedCommonSingleSelectEvent dropdownBeforeEvent) {
        commonSingleSelect.setDropdownBeforeEvent(dropdownBeforeEvent);
    }
    
    /**
     * 获取当前输入框呈现的值
     * @return
     */
    public DropDownBox.Data getDataValue(){
        return commonSingleSelect.getDataValue();
    }
}

1.1.1 表单中的下拉框(DefinedFormSingleSelect.java)(标题 + 不可编辑下拉框 + 右侧提示 + 可选帮助提示)

package com.view.control.select;

import java.util.Arrays;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;

import com.global.constant.Constants;
import com.util.FileUtil;
import com.view.control.DefinedFormControl;
import com.view.control.select.DefinedCommonSingleSelect.DefinedCommonSingleSelectEvent;
import com.view.control.valid.IValid;
import com.view.swt.SWTResourceManager;
import com.view.util.ImageUtil;


/**
 * <p>不可编辑单选下拉框</p>
 * @version V1.0
 */
public class DefinedFormSingleSelect extends DefinedFormControl{
    /****内容容器*****/
    private Composite contentComposite;
    /****显示名称控件****/
    private CLabel name;
    /*****显示名称**********/
    private String nameText;
    /*****设置显示名称控件的宽度*****/
    private int nameWidth = 100;
    /*****该控件中存放的默认值***/
    private DropDownBox.Data defaultValue;
    private List<DropDownBox.Data> comboDataList;
    private DefinedSingleSelect selector;
    private int comboRowWidth;
    private int comboWidth = 323;
    private int comboHeight = 32;
    private int comboRowHeight = 32;
    private Listener selectListener;
    private Listener helpListener;
    private boolean enable = true;
    private boolean showValue=false;
    private DefinedCommonSingleSelectEvent dropdownBeforeEvent;

    public DefinedFormSingleSelect(Composite parent,String nameText,List<DropDownBox.Data> comboDataList,int comboWidth) {
        super(parent);
        this.nameText = nameText;
        this.comboDataList = comboDataList;
        this.comboWidth = comboWidth;
    }
    
    public DefinedFormSingleSelect(Composite parent,String nameText,List<DropDownBox.Data> comboDataList,int comboWidth,int nameWidth,int comboHeight) {
        this(parent,nameText,comboDataList,comboWidth);
        this.comboWidth = comboWidth;
        this.nameWidth = nameWidth;
        this.comboHeight = comboHeight;
    }
    
    public DefinedFormSingleSelect(Composite parent,String nameText,List<DropDownBox.Data> comboDataList,int comboWidth,int nameWidth,int comboHeight,boolean showValue) {
        this(parent,nameText,comboDataList,comboWidth);
        this.comboWidth = comboWidth;
        this.nameWidth = nameWidth;
        this.comboHeight = comboHeight;    
        this.showValue=showValue;
    }

    @Override
    public void paint() {
        contentComposite = new Composite(this.parent,SWT.NONE);
        GridData gd_contentComposite = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
        gd_contentComposite.heightHint = comboHeight;
        contentComposite.setLayoutData(gd_contentComposite);
        GridLayout gl_contentComposite =new GridLayout(this.helpListener != null ? 4 : 3,false);
        gl_contentComposite.horizontalSpacing = 5;
        gl_contentComposite.verticalSpacing = 0;
        gl_contentComposite.marginHeight = 0;
        contentComposite.setLayout(gl_contentComposite);
        contentComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        
        name = new CLabel(contentComposite,SWT.NONE);
        GridData gd_name = new GridData(SWT.RIGHT, SWT.FILL, false, true, 1, 1);
        gd_name.widthHint = nameWidth;
        name.setLayoutData(gd_name);
        name.setAlignment(SWT.RIGHT);
        if(this.require){
            name.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream("images/asterisk.png")));
        }
        name.setText(nameText);
        name.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        
        if(this.helpListener != null){  //添加帮助图标
            Label help_img = new Label(contentComposite,SWT.NONE);
            help_img.setToolTipText("获取帮助");    
            help_img.setBackground(SWTResourceManager.getWhiteColor());
            help_img.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.HELP_NOR)));
            GridData gd_help_img = new GridData(SWT.LEFT,SWT.LEFT,false,false,1,1);
            gd_help_img.widthHint = 26;
            gd_help_img.heightHint = 24;
            help_img.setLayoutData(gd_help_img);
            help_img.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            help_img.addListener(SWT.MouseDown, this.helpListener);
            help_img.addListener(SWT.MouseEnter, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    help_img.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.HELP_HOVER)));
                }
            });
            help_img.addListener(SWT.MouseExit, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    help_img.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.HELP_NOR)));
                }
            });
        }
        
        selector = new DefinedSingleSelect(contentComposite,this.comboDataList,this.comboWidth,this.comboHeight,showValue);
        if(this.comboRowWidth != 0){
            selector.setComboRowWidth(this.comboRowWidth);
        }
        if(this.comboRowHeight!= 0){
            selector.setComboRowHeight(this.comboRowHeight);
        }
        if(null != this.defaultValue){
            selector.setDefaultValue(this.defaultValue);
        }
        if(null != selectListener){
            selector.addSelectListener(new Listener(){
                @Override
                public void handleEvent(Event event) {
                    showNormalMention(selector.getContentText());
                }
            });
            selector.addSelectListener(selectListener);
        }
        if(null != dropdownBeforeEvent){
            selector.setDropdownBeforeEvent(dropdownBeforeEvent);
        }
        selector.paint();
        selector.setEnabel(enable);

        mention = new Label(contentComposite,SWT.WRAP);
        GridData gd_mention = new GridData(SWT.LEFT, SWT.CENTER, false, true, 1, 1);
        if(super.mentionWidth != 0){
            gd_mention.widthHint = super.mentionWidth;
        }else{
            Rectangle bounds = this.parent.getBounds();
            if(bounds.width == 0){
                bounds = this.parent.getParent().getBounds();
            }
            gd_mention.widthHint = bounds.width - nameWidth - this.comboWidth-90;
        }
        mention.setLayoutData(gd_mention);
        mention.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        showNormalMention(getMentionComposite());
    }
    
    /**
     * 显示错误信息
     * @param errorText
     */
    public void showErrorMention(String errorText){
        super.showErrorMention(errorText, getMentionComposite());
    }

    /**
     * 设置成默认信息
     * @param text
     */
    public void resetNormalDefaultMention(String text){
        this.defaultMention = text;
        showNormalMention(getMentionComposite());
    }
    
    /**
     * 显示默认提示*/
    public void showNormalMention() {
        showNormalMention(getMentionComposite());
    }
    
    public void showNormalMention(String mentionTxt) {
        String originalMention = this.defaultMention;
        this.defaultMention = mentionTxt;
        showNormalMention(getMentionComposite());
        this.defaultMention = originalMention;
    }
    
    public void setNameWidth(int nameWidth) {
        this.nameWidth = nameWidth;
    }
    
    public Composite getContentComposite() {
        return contentComposite;
    }

    public void setDefaultMention(String defaultMention) {
        this.defaultMention = defaultMention;
    }
    
    public DropDownBox.Data getDefaultValue() {
        return defaultValue;
    }
    
    public void setDefaultValue(DropDownBox.Data defaultValue) {
        this.defaultValue = defaultValue;
    }
    
    public String getValue(){
        return selector.getValue();
    }

    public Label getImg() {
        return selector.getImg();
    }

    public void setSelectListener(Listener selectListener) {
        this.selectListener = selectListener;
    }

    public void setComboRowHeight(int comboRowHeight) {
        this.comboRowHeight = comboRowHeight;
    }

    
    public void setHelpListener(Listener helpListener) {
        this.helpListener = helpListener;
    }

    
    public void setEnable(boolean enable) {
        this.enable = enable;
    }

    
    public Label getMention() {
        return mention;
    }

    
    public DefinedSingleSelect getSelector() {
        return selector;
    }
    
    public void addValidListener(Integer mouseEvent,IValid ...valid){
        if(valid.length != 0){
            this.validlisteners.putAll(mouseEvent, Arrays.asList(valid));
        }
    }
    
    public void setDropdownBeforeEvent(DefinedCommonSingleSelectEvent dropdownBeforeEvent) {
        this.dropdownBeforeEvent = dropdownBeforeEvent;
    }

    @Override
    public Composite getMentionComposite() {
       return selector.getContentText();
    }
    
    /**
     * 更换下拉选择框的选择范围
     * @param comboDataList
     */
    public void setComboDataList(List<DropDownBox.Data> comboDataList){
        this.comboDataList = comboDataList;
        selector.setComboDataList(comboDataList);
    }
    
    /**
     * 清除选择的内容*/
    public void clearValue(){
        selector.clearValue();
    }
}

1.2 可编辑下拉框 ( DefinedSingleSelectWithText .java )(一个输入框 + 一个下拉弹出框)

package com.view.control.select;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;

import com.util.CollectionUtil;
import com.util.FileUtil;
import com.util.StringUtil;
import com.view.swt.SWTResourceManager;
import com.view.swt.SWTUtil;
import com.view.util.ImageUtil;

/**
 * <p>可编辑下拉框,parent为绝对布局</p>
 * @version V1.0
 */
public class DefinedSingleSelectWithText extends DropDownBox<DropDownBox.Data> {
    /****内容框容器的宽度****/
    private int comboWidth = 323;
    /****内容框容器的高度*****/
    private int comboHeight = 32;
    /****内容框容器*****/
    private Text contentText;
    private Label img;
    private String defaultValue;
    private List<Listener> contextListener;
    private boolean showImg = true;
    
    public DefinedSingleSelectWithText(Composite parent, List<Data> comboDataList, int comboRowWidth) {
        super(parent, comboDataList, comboRowWidth);
    }
    
    public DefinedSingleSelectWithText(Composite parent,List<Data> comboDataList,int comboWidth,int comboHeight) {
        this(parent,comboDataList,comboWidth);
        this.comboWidth = comboWidth;
        this.comboHeight = comboHeight;
    }
    
    @Override
    public void paint(){
        contentText = generateComposite(this.parent);
        if(StringUtil.isNotNullAndEmpty(this.defaultValue)){
            contentText.setText(defaultValue);
        }
    }
    
    /**
     * 创建文本框控件
     * @param contentComposite
     * @return
     */
    public Text generateComposite(Composite parentComposite){
        contentComposite = new Composite(parentComposite, SWT.NONE);
        contentComposite.setBounds(0, 0, this.comboWidth, this.comboHeight);
        GridLayout grid = new GridLayout(showImg?2:1, false);
        grid.horizontalSpacing = 1;
        grid.verticalSpacing = 0;
        grid.marginHeight = 1;
        grid.marginWidth = 5;
        contentComposite.setLayout(grid);
        contentComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        SWTUtil.paintBorder(contentComposite, SWTResourceManager.getColor(229,229,229));
        
        Text contentText = new Text(contentComposite,SWT.NONE);
        GridData gd_contentText = new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1);
        contentText.setLayoutData(gd_contentText);    
        contentText.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        
        if(CollectionUtil.isNotEmpty(this.contextListener)){
            for(Listener listener:this.contextListener){
                contentText.addListener(SWT.Modify,listener);
            }
        }
        
        if(showImg){
            img = new Label(contentComposite, SWT.NONE);
            GridData gd_img = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
            gd_img.widthHint = 24;
            gd_img.heightHint = 24;
            img.setLayoutData(gd_img);
            img.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
            img.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream("images/h-icon-angle-minimum-down.png")));
            img.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            img.addListener(SWT.MouseDown, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    //绘制下拉框
                    if(comboComposite != null && !comboComposite.isDisposed()){
                        comboDispose();
                    }else{
                        comboPaint();
                    }
                }
            });
        }
        contentComposite.layout(true);
        return contentText;
    }
        
    @Override
    protected void generateComboItemComposite(Data data, Composite itemComposite) {
        CLabel itemLabel = new CLabel(itemComposite,SWT.NONE);
        itemLabel.setData("data",data);
        itemLabel.setAlignment(SWT.LEFT);
        itemLabel.setBounds(10, 0, this.comboRowWidth -10, this.comboRowHeight);
        itemLabel.setText(data.getDisplay());
        itemLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        itemLabel.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
        
        itemLabel.addListener(SWT.MouseEnter, new Listener(){
            @Override
            public void handleEvent(Event event) {
                changeItemSelection(itemLabel);
            }
        });
        itemLabel.addListener(SWT.MouseExit, new Listener(){
            @Override
            public void handleEvent(Event event) {
                changeItemUnSelection(itemLabel);
            }
        });
        itemLabel.addListener(SWT.MouseDown, new Listener(){
            @Override
            public void handleEvent(Event event) {
                comboComposite.setVisible(false);
                contentText.setText(data.getDisplay());
                contentText.setData("value", data.getValue());
            }
        });
    }
    
    private void changeItemSelection(CLabel itemLabel){
        itemLabel.getParent().setBackground(SWTResourceManager.getColor(110,154,255));
        itemLabel.setBackground(SWTResourceManager.getColor(110,154,255));
        itemLabel.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    }
    
    private void changeItemUnSelection(CLabel itemLabel){
        itemLabel.getParent().setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        itemLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        itemLabel.setForeground(SWTResourceManager.getColor(51,51,51));
    }
    
    public String getValue(){
        return (String)this.contentText.getData("value");
    }

    public int getComboWidth() {
        return comboWidth;
    }

    public void setComboWidth(int comboWidth) {
        this.comboWidth = comboWidth;
    }

    public int getComboHeight() {
        return comboHeight;
    }
    
    public void setComboHeight(int comboHeight) {
        this.comboHeight = comboHeight;
    }

    public String getDefaultValue() {
        return defaultValue;
    }

    public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }

    public Text getContentText() {
        return contentText;
    }

    public Label getImg() {
        return img;
    }

    public Composite getContentComposite() {
        return contentComposite;
    }
    
    /**
     * 添加输入事件
     * @param listener
     */
    public void addCotextListener(Listener listener) {
        if(this.contextListener == null){
            this.contextListener = new ArrayList<Listener>();
        }
        this.contextListener.add(listener);
    }

    public boolean isShowImg() {
        return showImg;
    }

    public void setShowImg(boolean showImg) {
        this.showImg = showImg;
    }
}

1.2.1 表单中的下拉框(DefinedFormSingleSelectWithText .java)(标题 + 可编辑下拉框 + 右侧提示 + 可选帮助提示)

package com.view.control.select;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.map.MultiValueMap;
import org.apache.commons.lang.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;

import com.global.constant.Constants;
import com.util.CollectionUtil;
import com.util.FileUtil;
import com.util.StringUtil;
import com.view.control.DefinedControl;
import com.view.control.valid.DefinedValidListener;
import com.view.control.valid.IValid;
import com.view.control.valid.RequiredValid;
import com.view.swt.SWTResourceManager;
import com.view.swt.SWTUtil;
import com.view.util.ImageUtil;


/**
 * <p>可编辑单选下拉框</p>
 * @version V1.0
 */
public class DefinedFormSingleSelectWithText extends DefinedControl{
    /****内容容器*****/
    private Composite contentComposite;
    /****显示名称控件****/
    private CLabel name;
    /****是否是必填项****/
    private boolean require;
    /****提示信息********/
    private Label mention;
    /*****显示名称**********/
    private String nameText;
    /*****设置显示名称控件的宽度*****/
    private int nameWidth = 100;
    /*****校验结果,值为true,表示校验通过****/
    private boolean validResult = true;
    /*****默认提示,主要显示error区域*****/
    private String defaultMention;
    /*****该控件中存放的默认值***/
    private String defaultValue;
    private List<DropDownBox.Data> comboDataList;
    private DefinedSingleSelectWithText selector;
    private int comboRowWidth;
    private int comboWidth = 323;
    private int comboHeight = 32;
    private int comboRowHeight = 32;
    private Listener contextListener;
    private MultiValueMap validlisteners = MultiValueMap.decorate(new HashMap<Integer,IValid>());
    private Listener helpListener;
    private boolean showImg = true;

    public DefinedFormSingleSelectWithText(Composite parent,String nameText,List<DropDownBox.Data> comboDataList,int comboRowWidth) {
        super(parent);
        this.nameText = nameText;
        this.comboDataList = comboDataList;
        this.comboRowWidth = comboRowWidth;
    }
    
    public DefinedFormSingleSelectWithText(Composite parent,String nameText,List<DropDownBox.Data> comboDataList,int comboWidth,int nameWidth,int comboHeight) {
        this(parent,nameText,comboDataList,comboWidth);
        this.comboWidth = comboWidth;
        this.nameWidth = nameWidth;
        this.comboHeight = comboHeight;
    }

    @SuppressWarnings("unchecked")
    @Override
    public void paint() {
        contentComposite = new Composite(this.parent,SWT.NONE);
        GridData gd_contentComposite = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
        gd_contentComposite.heightHint = comboHeight;
        contentComposite.setLayoutData(gd_contentComposite);
        GridLayout gl_contentComposite = new GridLayout(this.helpListener != null ? 4 : 3,false);
        gl_contentComposite.horizontalSpacing = 5;
        gl_contentComposite.verticalSpacing = 0;
        gl_contentComposite.marginHeight = 0;
        contentComposite.setLayout(gl_contentComposite);
        contentComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        
        name = new CLabel(contentComposite,SWT.NONE);
        GridData gd_name = new GridData(SWT.RIGHT, SWT.FILL, false, true, 1, 1);
        gd_name.widthHint = nameWidth;
        name.setLayoutData(gd_name);
        name.setAlignment(SWT.RIGHT);
        if(this.require){
            name.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream("images/asterisk.png")));
        }
        name.setText(nameText);
        name.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        
        if(this.helpListener != null){  //添加帮助图标
            Label help_img = new Label(contentComposite,SWT.NONE);
            help_img.setToolTipText("获取帮助");    
            help_img.setBackground(SWTResourceManager.getWhiteColor());
            help_img.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.HELP_NOR)));
            GridData gd_help_img = new GridData(SWT.LEFT,SWT.LEFT,false,false,1,1);
            gd_help_img.widthHint = 26;
            gd_help_img.heightHint = 24;
            help_img.setLayoutData(gd_help_img);
            help_img.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND));
            help_img.addListener(SWT.MouseDown, this.helpListener);
            help_img.addListener(SWT.MouseEnter, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    help_img.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.HELP_HOVER)));
                }
            });
            help_img.addListener(SWT.MouseExit, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    help_img.setImage(ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.HELP_NOR)));
                }
            });
        }
        
        Composite selectorComposite = new Composite(contentComposite,SWT.NONE);
        GridData gd_selectorComposite = new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1);
        gd_selectorComposite.widthHint = this.comboWidth;
        gd_selectorComposite.heightHint = this.comboHeight;
        selectorComposite.setLayoutData(gd_selectorComposite);
        selector = new DefinedSingleSelectWithText(selectorComposite,this.comboDataList,this.comboWidth,this.comboHeight);
        if(this.comboRowWidth != 0){
            selector.setComboRowWidth(this.comboRowWidth);
        }
        if(this.comboRowHeight!= 0){
            selector.setComboRowHeight(this.comboRowHeight);
        }
        if(StringUtil.isNotNullAndEmpty(this.defaultValue)){
            selector.setDefaultValue(this.defaultValue);
        }
        if(null != contextListener){
            selector.addCotextListener(contextListener);
        }
        selector.setShowImg(showImg);
        selector.paint();
        
        mention = new Label(contentComposite,SWT.WRAP);
        GridData gd_mention = new GridData(SWT.LEFT, SWT.CENTER, false, true, 1, 1);
        Rectangle bounds = this.parent.getBounds();
        if(bounds.width == 0){
            bounds = this.parent.getParent().getBounds();
        }
        gd_mention.widthHint = bounds.width - nameWidth - this.comboWidth-10;
        mention.setLayoutData(gd_mention);
        mention.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        showNormalMention();

        /*****为输入添加事件***************/
        if(require){
            RequiredValid valid = new RequiredValid();
            selector.getContentText().addFocusListener(new FocusListener(){
                @Override
                public void focusGained(FocusEvent e) {
                    validResult = true;
                }

                @Override
                public void focusLost(FocusEvent e) {
                    if(validResult){
                        String message = valid.valid(selector.getContentText().getText());
                        if(StringUtil.isNotNullAndEmpty(message)){
                            showErrorMention(message);
                        }else{
                            showNormalMention();
                        }
                    }
                }
            });
        }
        
        if(CollectionUtil.isNotMultiEmpty(validlisteners)){
            selector.getContentText().addListener(SWT.Modify, new Listener(){
                @Override
                public void handleEvent(Event event) {
                    validResult = true;
                }
            });;
            Set<Integer> keySet = validlisteners.keySet();
            Iterator<IValid> iterator = null;
            IValid valid = null;
            for(Integer key:keySet){
                if(CollectionUtil.isNotEmpty(validlisteners.getCollection(key))){
                    iterator = validlisteners.getCollection(key).iterator();
                    while(iterator.hasNext()){
                        valid = iterator.next();
                        selector.getContentText().addListener(key, new DefinedValidListener(valid){
                            @Override
                            public void handleEvent(Event event) {
                                if(validResult){
                                    String message = this.getValid().valid(selector.getValue());
                                    if(StringUtil.isNotNullAndEmpty(message)){
                                        showErrorMention(message);
                                    }else{
                                        showNormalMention();
                                    }
                                }
                            }
                        });
                    }
                }
            }
        }
    }
    
    /**
     * 显示错误信息
     * @param errorText
     */
    private void showErrorMention(String errorText){
        SWTUtil.changeBorderToRed(selector.getContentComposite());
        mention.setText(errorText);
        mention.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
        mention.getParent().layout(true);
        validResult = false;
    }

    /**
     * 显示默认提示*/
    private void showNormalMention(){
        SWTUtil.changeBorderToNormal(selector.getContentComposite());
        if(StringUtil.isNotNullAndEmpty(defaultMention)){
            mention.setForeground(SWTResourceManager.getColor(200,200,200));
            mention.setText(defaultMention);
        }else{
            mention.setText(StringUtils.EMPTY);
        }
        mention.getParent().layout(true);
        validResult = true;
    }
    
    public void addValidListener(Integer mouseEvent,IValid ...valid){
        if(valid.length != 0){
            this.validlisteners.putAll(mouseEvent, Arrays.asList(valid));
        }
    }
    
    public boolean notifyValid(){
        if(CollectionUtil.isNotMultiEmpty(validlisteners)){
            @SuppressWarnings("unchecked")
            Set<Integer> keySet = validlisteners.keySet();
            Event event = new Event();
            event.widget = selector.getContentText();
            MultiValueMap excludeListener = MultiValueMap.decorate(new HashMap<Integer,Listener>(), ArrayList.class);
            for(Integer key:keySet){
                if(CollectionUtil.isNotEmpty(validlisteners.getCollection(key))){
                    if(validResult){
                        Listener[] listeners = selector.getContentText().getListeners(key);
                        for(Listener listener:listeners){
                            if(!(listener instanceof DefinedValidListener)){
                                excludeListener.put(key, listener);
                                selector.getContentText().removeListener(key, listener);
                            }
                        }
                        selector.getContentText().notifyListeners(key, event);
                    }
                }
            }
            if(CollectionUtil.isNotEmpty(excludeListener)){
                for(Object key:excludeListener.keySet()){
                    for(Object listener:excludeListener.getCollection(key)){
                        selector.getContentText().addListener((Integer)key, (Listener)listener);
                    }
                }
            }
        }
        return validResult;
    }
    
    public void setNameWidth(int nameWidth) {
        this.nameWidth = nameWidth;
    }
    
    public Composite getContentComposite() {
        return contentComposite;
    }
    
    public void setRequire(boolean require) {
        this.require = require;
    }

    public void setMention(Label mention) {
        this.mention = mention;
    }

    public void setDefaultMention(String defaultMention) {
        this.defaultMention = defaultMention;
    }
    
    public String getDefaultValue() {
        return defaultValue;
    }
    
    public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }
    
    public String getValue(){
        return selector.getContentText().getText();
    }

    public Label getImg() {
        return selector.getImg();
    }

    public void setContextListener(Listener listener) {
        this.contextListener = listener;
    }

    public void setComboRowHeight(int comboRowHeight) {
        this.comboRowHeight = comboRowHeight;
    }

    
    public DefinedSingleSelectWithText getSelector() {
        return selector;
    }

    public Composite getComboComposite() {
        return selector.getComboComposite();
    }
    
    public void setComboDataList(List<DropDownBox.Data> comboDataList) {
        this.comboDataList = comboDataList;
    }

    
    public void setHelpListener(Listener helpListener) {
        this.helpListener = helpListener;
    }

    public boolean isShowImg() {
        return showImg;
    }

    public void setShowImg(boolean showImg) {
        this.showImg = showImg;
    }
}

关于多选下拉框、带搜索功能的下拉框见下章节。

猜你喜欢

转载自www.cnblogs.com/sandyflower/p/9750068.html