自定义SWT控件二之自定义多选下拉框
Posted sandyflower
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义SWT控件二之自定义多选下拉框相关的知识,希望对你有一定的参考价值。
2、自定义下拉多选框
package com.view.control.select; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Image; 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.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import com.global.constant.Constants; import com.util.CollectionUtil; import com.util.FileUtil; import com.view.control.DefinedControl; import com.view.swt.SWTResourceManager; import com.view.swt.SWTUtil; import com.view.util.ImageUtil; /** * <p> * 多选下拉框的通用逻辑 * </p> * @version V1.0 */ public class DefinedCommonMultiSelect extends DefinedControl { /**** 其父框需要是gridLaout布局 *****/ private Composite choseMaxComposite; /**** 选中内容显示的文本区域容器 *****/ private Composite chooseComposite; /*** 下一个item所在的x坐标 ***/ private int chooseItemNextX = 0; /*** 下一个item所在的y坐标 ******/ private int chooseItemNextY = 0; private List<DropDownBox.Data> selectedList = new ArrayList<DropDownBox.Data>(); /*** 选中内容显示的文本区域实际的宽度 ****/ private int chooseRealWidth; private Map<DropDownBox.Data, Composite> selectedCompositeMap = new LinkedHashMap<DropDownBox.Data, Composite>(); private Map<DropDownBox.Data, Label> comboImg = new HashMap<DropDownBox.Data, Label>(); /**** 选中内容显示的文本区域 + 下拉图标 总宽度 ****/ private int chooseWidth = 323; /**** 内容框中的每项的高度 *****/ private int chooseItemHeight = 24; /**** 默认值 ***/ private List<DropDownBox.Data> defaultValueList = new ArrayList<DropDownBox.Data>(); private List<DefinedCommonMultiSelectEvent> itemHandlerListener; private Label img; private DropDownBox<DropDownBox.Data> dropDownBox; private Image CHECKBOX_NOR_ICON = ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.CHECKBOX_NOR_ICON)); private Image CHECKBOX_SELF_ICON = ImageUtil.getImage(FileUtil.loadResourceFileAsStream(Constants.CHECKBOX_SELF_ICON)); public DefinedCommonMultiSelect(Composite parent, DropDownBox<DropDownBox.Data> dropDownBox) { super(parent); this.dropDownBox = dropDownBox; } public DefinedCommonMultiSelect(Composite parent,int chooseWidth, int chooseItemHeight, DropDownBox<DropDownBox.Data> dropDownBox) { this(parent, dropDownBox); this.chooseWidth = chooseWidth; this.chooseItemHeight = chooseItemHeight; } @Override public void paint() { this.chooseComposite = generateComposite(this.parent); } /** * 创建显示下拉框的内容 * @param contentComposite * @return */ protected Composite generateComposite(Composite contentComposite) { choseMaxComposite = new Composite(contentComposite, SWT.NONE); GridData gd_contentComposite = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); gd_contentComposite.widthHint = this.chooseWidth; choseMaxComposite.setLayoutData(gd_contentComposite); GridLayout grid = new GridLayout(2, false); grid.horizontalSpacing = 0; grid.marginHeight = 1; grid.marginWidth = 1; choseMaxComposite.setLayout(grid); choseMaxComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); SWTUtil.paintBorder(choseMaxComposite, SWTResourceManager.getColor(229, 229, 229)); dropDownBox.setContentComposite(choseMaxComposite); Composite text_container_composite = new Composite(choseMaxComposite, SWT.NONE); GridData gd_text_container_composite = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1); text_container_composite.setLayoutData(gd_text_container_composite); text_container_composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); grid = new GridLayout(1, true); grid.horizontalSpacing = 0; grid.marginHeight = 2; grid.marginWidth = 2; text_container_composite.setLayout(grid); Composite text_composite = new Composite(text_container_composite, SWT.NONE); text_composite.setData("rootParent", this.parent); GridData gd_text_composite = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); chooseRealWidth = this.chooseWidth - 6 - 24; gd_text_composite.widthHint = chooseRealWidth; gd_text_composite.heightHint = this.chooseItemHeight + 4; text_composite.setLayoutData(gd_text_composite); text_composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); if (CollectionUtil.isNotEmpty(defaultValueList)) { List<DropDownBox.Data> dataList = new ArrayList<>(); for (DropDownBox.Data defaultValue: defaultValueList) { addUniqueNickName(dataList,defaultValue); dataList.add(defaultValue); generateChooseItemComposite(text_composite, defaultValue); } } img = new Label(choseMaxComposite, 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(Constants.ARROW_DOWN))); 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) { Composite comboComposite = dropDownBox.getComboComposite(); if(comboComposite !=null && !comboComposite.isDisposed()){ dropDownBox.comboDispose(); }else{ dropDownBox.comboPaint(); } } }); choseMaxComposite.layout(true); choseMaxComposite.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { dropDownBox.dispose(); } }); return text_composite; } /** * 重命名data的昵称 * @param dataList * @param defaultValue * @return */ private boolean addUniqueNickName(List<DropDownBox.Data> dataList,DropDownBox.Data defaultValue){ if(dataList.contains(defaultValue)){ dataList.forEach(data->{ if(data.getValue().equals(defaultValue.getValue()) && data.getNickname()>defaultValue.getNickname()) { defaultValue.setNickname(data.getNickname()); } }); defaultValue.setNickname(defaultValue.getNickname()+1); return true; } return false; } public Label getImg() { return img; } protected void generateChooseItemComposite(DropDownBox.Data data) { Composite containerComposite = generateChooseItemComposite(chooseComposite, data); Composite parentComposite = containerComposite.getParent(); parentComposite.layout(true); parentComposite.getParent().layout(true); parentComposite.getParent().getParent().layout(true); parentComposite.getParent().getParent().getParent().layout(true); } /** * 生成一个chooseItemComposite * @param text_composite * @return */ private Composite generateChooseItemComposite(Composite text_composite, DropDownBox.Data data) { Composite containerComposite = new Composite(text_composite, SWT.NONE); containerComposite.setData("rootParent", this.parent); GridLayout gl_containerComposite = new GridLayout(1, true); gl_containerComposite.marginHeight = 2; gl_containerComposite.marginWidth = 2; gl_containerComposite.horizontalSpacing = 0; containerComposite.setLayout(gl_containerComposite); containerComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); Composite itemComposite = new Composite(containerComposite, SWT.NONE); itemComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); itemComposite.setBackground(SWTResourceManager.getColor(245, 245, 245)); SWTUtil.paintBorder(itemComposite, SWTResourceManager.getBorderColor()); GridLayout gl_itemComposite = new GridLayout(2, false); gl_itemComposite.marginHeight = 1; gl_itemComposite.marginWidth = 3; gl_itemComposite.horizontalSpacing = 2; itemComposite.setLayout(gl_itemComposite); itemComposite.setData("value", data); CLabel label = new CLabel(itemComposite, SWT.NONE); label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1)); label.setBackground(SWTResourceManager.getColor(245, 245, 245)); label.setText(data.getDisplay()); label.setAlignment(SWT.CENTER); label.setForeground(SWTResourceManager.getColor(51, 51, 51)); Label img = new Label(itemComposite, SWT.NONE); GridData gd_img = new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1); gd_img.widthHint = 16; gd_img.heightHint = 16; img.setLayoutData(gd_img); img.setText("X"); img.setBackground(SWTResourceManager.getColor(245, 245, 245)); img.setCursor(SWTResourceManager.getCursor(SWT.CURSOR_HAND)); img.addListener(SWT.MouseDown, new Listener() { @Override public void handleEvent(Event event) { disposeChooseItemComposite(data); } }); itemComposite.layout(true); int containerCompositeWidth = 24 + label.getBounds().width + 4; boolean change = false; containerComposite.setSize(containerCompositeWidth, this.chooseItemHeight + 4); if ((this.chooseRealWidth - this.chooseItemNextX - containerCompositeWidth) < 0) { this.chooseItemNextY += this.chooseItemHeight + 4; this.chooseItemNextX = 0; change = true; } containerComposite.setLocation(this.chooseItemNextX, this.chooseItemNextY); this.chooseItemNextX += containerCompositeWidth; this.selectedList.add(data); this.selectedCompositeMap.put(data, containerComposite); containerComposite.layout(true); if (change) { ((GridData)text_composite.getLayoutData()).heightHint = this.chooseItemNextY + this.chooseItemHeight + 4; reLayoutAllParent(text_composite); dropDownBox.reLocation(); } if (CollectionUtil.isNotEmpty(itemHandlerListener)) { for (DefinedCommonMultiSelectEvent event : itemHandlerListener) { event.addItemEvent(data, containerComposite); } } return containerComposite; } /** * 销毁一个选中文本框中的一项(同时将其在下拉框中的项置为未选中状态) * @param data */ protected void disposeChooseItemComposite(DropDownBox.Data data) { selectedList.remove(data); Composite containerComposite = selectedCompositeMap.get(data); Composite beforeComposite = null; Composite beforecontainerComposite = null; Rectangle bounds; int nextX = containerComposite.getBounds().x; int nextY = containerComposite.getBounds().y; boolean deleteLast = true; // 要删除的是最后一个 for (Composite leftContainerComposite : selectedCompositeMap.values()) { if (leftContainerComposite == containerComposite) { beforeComposite = leftContainerComposite; continue; } if (null != beforeComposite) { deleteLast = false; if ((this.chooseRealWidth - nextX - leftContainerComposite.getBounds().width) < 0) { leftContainerComposite.setLocation(0, nextY + this.chooseItemHeight + 4); } else { leftContainerComposite.setLocation(nextX, nextY); } leftContainerComposite.layout(true); bounds = leftContainerComposite.getBounds(); nextX = bounds.x + bounds.width; nextY = bounds.y; beforeComposite = leftContainerComposite; } else { beforecontainerComposite = leftContainerComposite; } } boolean change = false; selectedCompositeMap.remove(data); if (deleteLast) { if (beforecontainerComposite == null) { nextX = 0; nextY = 0; } else { nextX = beforecontainerComposite.getBounds().x + beforecontainerComposite.getBounds().width; nextY = beforecontainerComposite.getBounds().y; } } chooseItemNextX = nextX; if (chooseItemNextY != nextY) { change = true; } chooseItemNextY = nextY; Composite parentComposite = containerComposite.getParent(); Label imgLabel = comboImg.get(data); if(imgLabel != null && !imgLabel.isDisposed()){ changeUnSelectCheckBox(imgLabel); }else{ comboImg.remove(data); } containerComposite.dispose(); if (change) { if (0 == chooseItemNextY) { ((GridData)parentComposite.getLayoutData()).heightHint = this.chooseItemHeight + 4; } else ((GridData)parentComposite.getLayoutData()).heightHint = chooseItemNextY + this.chooseItemHeight + 4; reLayoutAllParent(parentComposite); dropDownBox.reLocation(); } if (CollectionUtil.isNotEmpty(itemHandlerListener)) { for (DefinedCommonMultiSelectEvent event : itemHandlerListener) { event.disposeItemEvent(data, parentComposite); } } } /** * 获取当前的高度 * @return */ protected int getHeight() { return this.chooseItemNextY + this.chooseItemHeight + 4 + 6; } protected Composite getChoseMaxComposite() { return choseMaxComposite; } /** * 所有的重新绘制 * @param composite */ private void reLayoutAllParent(Composite composite) { Composite contentComposite = composite; while(contentComposite != this.parent){ contentComposite.layout(true); contentComposite = contentComposite.getParent(); } contentComposite.layout(true); Composite parentComposite = contentComposite.getParent(); while(!(parentComposite instanceof ScrolledComposite) && !(parentComposite instanceof Shell)){ parentComposite.layout(true); contentComposite = parentComposite; parentComposite = parentComposite.getParent(); } if(parentComposite instanceof ScrolledComposite){ ((ScrolledComposite)parentComposite).setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); } } /** * 将checkbox变成选中状态 * @param img */ protected void changeSelectCheckBox(Label img) { if(img != null && !img.isDisposed()){ img.setImage(CHECKBOX_SELF_ICON); img.setData("checked", true); } } /** * 将checkbox变成未选中状态 * @param img */ protected void changeUnSelectCheckBox(Label img) { if(null != img && !img.isDisposed()){ img.setImage(CHECKBOX_NOR_ICON); img.setData("checked", false); } } /** * 销毁掉所有已选择的内容*/ protected void disposeAllChooseItem() { while ((CollectionUtil.isNotEmpty(this.selectedList))) { this.disposeChooseItemComposite(this.selectedList.get(0)); } } private void changeItemSelection(CLabel itemLabel) { itemLabel.getParent().setBackground(SWTResourceManager.getColor(226, 235, 255)); Control[] children = itemLabel.getParent().getChildren(); for (Control child : children) { child.setBackground(SWTResourceManager.getColor(226, 235, 255)); } } protected void generateComboItemComposite(DropDownBox.Data data, Composite itemComposite) { GridLayout gl_itemComposite = new GridLayout(2,false); gl_itemComposite.verticalSpacing = 0; gl_itemComposite.horizontalSpacing = 5; itemComposite.setLayout(gl_itemComposite); Label img = new Label(itemComposite, SWT.NONE); GridData gd_img = new GridData(SWT.FILL,SWT.FILL,false,false,1,1); gd_img.widthHint = 24; gd_img.heightHint = 24; img.setLayoutData(gd_img); img.setData("value", data); if (this.selectedList.contains(data)) { changeSelectCheckBox(img); } else { changeUnSelectCheckBox(img); } 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) { Label img = (Label)event.widget; boolean select = (boolean)img.getData("checked"); DropDownBox.Data data = (DropDownBox.Data)img.getData("value"); if (select) { disposeChooseItemComposite(data); } else { generateChooseItemComposite(data); changeSelectCheckBox(img); } } }); addDropDownCheckBoxImg(data, img); CLabel itemLabel = new CLabel(itemComposite, SWT.NONE); if(dropDownBox.showValue){ itemLabel.setText(data.getDisplay()+"("+data.getValue()+")"); }else itemLabel.setText(data.getDisplay()); itemLabel.setData("value", data); itemLabel.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); GridData gd_itemLabel= new GridData(SWT.FILL,SWT.FILL,true,true,1,1); itemLabel.setLayoutData(gd_itemLabel); 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) { Event newEvent = new Event(); newEvent.widget = img; img.notifyListeners(SWT.MouseDown, newEvent); } }); itemComposite.layout(true); } private void changeItemUnSelection(CLabel itemLabel) { itemLabel.getParent().setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); Control[] children = itemLabel.getParent().getChildren(); for (Control child : children) { child.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); } } protected void addItemHandlerListener(DefinedCommonMultiSelectEvent itemHandlerListener) { if (null == this.itemHandlerListener) { this.itemHandlerListener = new ArrayList<DefinedCommonMultiSelectEvent>(); } this.itemHandlerListener.add(itemHandlerListener); } public Composite getChooseComposite() { return chooseComposite; } protected List<DropDownBox.Data> getSelectedList() { return selectedList; } protected void addDropDownCheckBoxImg(DropDownBox.Data data, Label img) { comboImg.put(data, img); } public void setSelectedList(List<DropDownBox.Data> selectedList) { this.selectedList = selectedList; } public int getChooseWidth() { return chooseWidth; } public void setChooseWidth(int chooseWidth) { this.chooseWidth = chooseWidth; } public int getChooseItemHeight() { return chooseItemHeight; } public void setChooseItemHeight(int chooseItemHeight) { this.chooseItemHeight = chooseItemHeight; } public void setDefaultValueList(List<DropDownBox.Data> defaultValueList) { this.defaultValueList = defaultValueList; } /** * 获取已经选择的所有值 */ @Override public Object getValue() { // TODO Auto-generated method stub return this.selectedList; } /** * <p> * 销毁和添加一个选项发生的事件(主要用于保存后台数据时使用) * </p> * @version V1.0 */ public interface DefinedCommonMultiSelectEvent { /** * * @param data * @param text_composite 输入框控件,该控件data属性key"rootParent",可以拿到该行控件 */ void disposeItemEvent(DropDownBox.Data data, Composite text_composite); /** * * @param data * @param text_composite 为输入框中的一个item,该控件data属性key"rootParent",可以拿到该行控件 */ void addItemEvent(DropDownBox.Data data, Composite text_composite); } }
DefinedCommonMultiSelect.java 为自定义多选下拉框公共部分
package com.view.control.select; import java.util.List; import org.eclipse.swt.widgets.Composite; import com.view.control.select.DefinedCommonMultiSelect.DefinedCommonMultiSelectEvent; /** * <p>自定义多选择框(parent必须是gridLayout布局)</p> * @version V1.0 */ public class DefinedMultiSelect extends DropDownBox<DropDownBox.Data> { private DefinedCommonMultiSelect commonMultiSelect; public DefinedMultiSelect(Composite parent, List<DropDownBox.Data> comboDataList, int comboRowWidth) { super(parent, comboDataList, comboRowWidth); commonMultiSelect = new DefinedCommonMultiSelect(parent,this); } public DefinedMultiSelect(Composite parent,List<Data> comboDataList,int chooseWidth,int chooseItemHeight) { this(parent,comboDataList,chooseWidth); commonMultiSelect = new DefinedCommonMultiSelect(parent,chooseWidth,chooseItemHeight,this); } public void paint(){ commonMultiSelect.paint(); } @Override protected void generateComboItemComposite(Data data, Composite itemComposite) { commonMultiSelect.generateComboItemComposite(data,itemComposite); } public void addItemHandlerListener(DefinedCommonMultiSelectEvent itemHandlerListener) { commonMultiSelect.addItemHandlerListener(itemHandlerListener); } public List<Data> getSelectedList() { return commonMultiSelect.getSelectedList(); } public void setSelectedList(List<Data> selectedList) { commonMultiSelect.setSelectedList(selectedList); } public int getChooseWidth() { return commonMultiSelect.getChooseWidth(); } public void setChooseWidth(int chooseWidth) { commonMultiSelect.setChooseWidth(chooseWidth); } public int getChooseItemHeight() { return commonMultiSelect.getChooseItemHeight(); } public void setChooseItemHeight(int chooseItemHeight) { commonMultiSelect.setChooseItemHeight(chooseItemHeight); } public Composite getChoseMaxComposite() { return commonMultiSelect.getChoseMaxComposite(); } public Composite getChooseComposite() { return commonMultiSelect.getChooseComposite(); } public void setDefaultValueList(List<DropDownBox.Data> defaultValueList) { commonMultiSelect.setDefaultValueList(defaultValueList); } public int getHeight(){ return commonMultiSelect.getHeight(); } public void disposeAllChooseItem(){ commonMultiSelect.disposeAllChooseItem(); } /** * 获取选择的值 */ @SuppressWarnings("unchecked") public List<DropDownBox.Data> getValue(){ return (List<DropDownBox.Data>) commonMultiSelect.getValue(); } }
DefinedMultiSelect.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.custom.ScrolledComposite; 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 org.eclipse.swt.widgets.Shell; import com.global.constant.Constants; import com.util.CollectionUtil; import com.util.FileUtil; import com.util.StringUtil; import com.view.control.DefinedFormControl; import com.view.control.select.DefinedCommonMultiSelect.DefinedCommonMultiSelectEvent; import com.view.swt.SWTResourceManager; import com.view.util.ImageUtil; /** * <p>多选下拉框不可编辑</p> * @version V1.0 */ public class DefinedFormMultiSelect extends DefinedFormControl{ /****内容容器*****/ private Composite contentComposite; /****显示名称控件****/ private CLabel name; private DefinedMultiSelect multiSelect; /****选中内容显示的文本区域 + 下拉图标 总宽度****/ private int chooseWidth = 323; /****内容框中的每项的高度*****/ private int chooseItemHeight = 24; /*****显示名称**********/ private String nameText; /*****设置显示名称控件的宽度*****/ private int nameWidth = 100; /****默认值***/ private List<DropDownBox.Data> defaultValueList = new ArrayList<>(); private List<DropDownBox.Data> selectedList = new ArrayList<DropDownBox.Data>(); private int comboRowWidth; private Listener helpListener; private Listener selectListener; public Listener getSelectListener() { return selectListener; } public void setSelectListener(Listener selectListener) { this.selectListener = selectListener; } private List<DefinedCommonMultiSelectEvent> multiSelectEventList; private boolean showValue = false; public DefinedFormMultiSelect(Composite parent,String nameText, List<DropDownBox.Data> comboDataList, int comboRowWidth) { super(parent); this.nameText = nameText; this.selectedList = comboDataList; this.comboRowWidth = comboRowWidth; } public DefinedFormMultiSelect(Composite parent,String nameText,List<DropDownBox.Data> comboDataList,int chooseWidth,int nameWidth,int chooseItemHeight) { this(parent,nameText,comboDataList,chooseWidth); this.chooseWidth = chooseWidth; this.nameWidth = nameWidth; this.chooseItemHeight = chooseItemHeight; } @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.widthHint = this.chooseWidth+nameWidth+2 + (this.helpListener != null? 24:0); //24为帮助图标宽度 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 - 2; 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)); multiSelect = new DefinedMultiSelect(contentComposite,this.selectedList,this.comboRowWidth); if(this.chooseWidth != 0){ multiSelect.setChooseWidth(this.chooseWidth); } if(this.chooseItemHeight != 0){ multiSelect.setChooseItemHeight(this.chooseItemHeight); } if(CollectionUtil.isNotEmpty(defaultValueList)){ multiSelect.setDefaultValueList(defaultValueList); } multiSelect.setShowValue(showValue); multiSelect.addItemHandlerListener(new DefinedCommonMultiSelectEvent() { @Override public void disposeItemEvent(DropDownBox.Data data, Composite text_composite) { reLayoutAllParent(text_composite); } @Override public void addItemEvent(DropDownBox.Data data, Composite text_composite) { reLayoutAllParent(text_composite); } }); multiSelect.addItemHandlerListener(new DefinedCommonMultiSelectEvent(){ @Override public void disposeItemEvent(DropDownBox.Data data, Composite text_composite) { if(CollectionUtil.isEmpty(multiSelect.getValue()) && require){ //为空 Composite composite = getMentionComposite(); if(composite != null) { showErrorMention("不能为空",composite); } } } @Override public void addItemEvent(DropDownBox.Data data, Composite text_composite) { Composite composite = getMentionComposite(); if(null != composite && !composite.isDisposed() && mention != null && !mention.isDisposed()){ showNormalMention(composite); } } }); if(CollectionUtil.isNotEmpty(multiSelectEventList)){ for(DefinedCommonMultiSelectEvent event:multiSelectEventList){ multiSelect.addItemHandlerListener(event); } } multiSelect.paint(); 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.FILL,SWT.FILL,false,false,1,1); gd_help_img.widthHint = 24; 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))); } }); } 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.chooseWidth - 10; } mention.setLayoutData(gd_mention); mention.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE)); showNormalMention(getMentionComposite()); } /** * 所有的重新绘制 * @param composite */ private void reLayoutAllParent(Composite composite){ Composite contentComposite = composite; while(contentComposite != this.parent){ contentComposite.layout(true); contentComposite = contentComposite.getParent(); } contentComposite.layout(true); Composite parentComposite = contentComposite.getParent(); while(!(parentComposite instanceof ScrolledComposite) && !(parentComposite instanceof Shell)){ parentComposite.layout(true); contentComposite = parentComposite; parentComposite = parentComposite.getParent(); } if(parentComposite instanceof ScrolledComposite){ ((ScrolledComposite)parentComposite).setMinSize(contentComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); } } 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 int getChooseWidth() { return chooseWidth; } public void setChooseWidth(int chooseWidth) { this.chooseWidth = chooseWidth; } public int getChooseItemHeight() { return chooseItemHeight; } public void setChooseItemHeight(int chooseItemHeight) { this.chooseItemHeight = chooseItemHeight; } public boolean isValidResult() { return validResult; } public void setValidResult(boolean validResult) { this.validResult = validResult; } public String getDefaultMention() { return defaultMention; } public List<DropDownBox.Data> getDefaultValueList() { return defaultValueList; } public List<DropDownBox.Data> getSelectedList() { return selectedList; } public void setNameText(String nameText) { this.nameText = nameText; } public boolean isShowValue() { return showValue; } public void setShowValue(boolean showValue) { this.showValue = showValue; } public void setDefaultValueList(List<DropDownBox.Data> defaultValueList) { this.defaultValueList = defaultValueList; } public void addItemHandlerListener(DefinedCommonMultiSelectEvent itemHandlerListener) { if(null == this.multiSelectEventList){ this.multiSelectEventList = new ArrayList<DefinedCommonMultiSelectEvent>(); } this.multiSelectEventList.add(itemHandlerListener); } public void setHelpListener(Listener helpListener) { this.helpListener = helpListener; } @Override public Composite getMentionComposite() { // TODO Auto-generated method stub if(null != multiSelect.getChooseComposite()){ return multiSelect.getChooseComposite().getParent(); }else{ return null; } } @Override public String getValue() { List<DropDownBox.Data> dataList = multiSelect.getValue(); StringBuilder builder = new StringBuilder(); for(DropDownBox.Data data:dataList){ builder.append(data.getValue()).append(","); } if(StringUtil.isNotNullAndEmpty(builder.toString())){ builder = builder.deleteCharAt(builder.length()-1); } return builder.toString(); } }
DefinedFormMultiSelect.java 表单多选下拉框(标题 + 多选下拉框 + 提示 + 可选帮助)
带搜索功能的下拉框见下章节。
以上是关于自定义SWT控件二之自定义多选下拉框的主要内容,如果未能解决你的问题,请参考以下文章