自定义SWT控件三之搜索功能下拉框
Posted sandyflower
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义SWT控件三之搜索功能下拉框相关的知识,希望对你有一定的参考价值。
3、搜索功能下拉弹出框
package com.view.control.select; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import log.HikLog; import org.apache.commons.lang3.StringUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.ImageLoader; 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.Listener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.global.constant.Constants; import com.util.CollectionUtil; import com.util.FileUtil; import com.util.StringUtil; import com.view.control.DefinedSearchText; import com.view.control.ImageViewer; import com.view.swt.SWTResourceManager; import com.view.swt.SWTUtil; /** * <p>带有搜索内容的下拉框</p> * @version V1.0 */ public abstract class SearchDropDown<T> extends DropDownBox<T> { private static final Logger log = LoggerFactory.getLogger(SearchDropDown.class); /***搜索高度****/ protected int searchHeight = 50; /***搜索默认提示显示****/ protected String defaultMentionHint; /***搜索框*****/ protected DefinedSearchText<T> searchText; /****搜索框事件****/ protected DefinedSearchText.SearchTextEvent<T> searchTextEvent; /***是否异步展示***/ protected boolean asynchronous = false; /***每页显示条数(异步展示时生效)****/ protected int pagePerNum = 10; /***当前页数******/ protected int pageNumNow = 0; /****text文本框的宽度****/ protected int textWidth = 323; /****text文本框的高度*****/ protected int textHeight = 32; /***加载区域的高度****/ protected int loadHeight = 20; protected ScrolledComposite searchScrollContentComposite; protected List<Object> searchExternalFilterList; /***初始化不触发搜索事件****/ protected boolean initEmpty = false; protected boolean finish = false; protected boolean init = true; /***总量******/ protected int totalCount; protected CLabel mentionHint; @Deprecated public SearchDropDown(Composite parent, List<T> comboDataList, int comboRowWidth,DefinedSearchText.SearchTextEvent<T> searchTextEvent) { super(parent, comboDataList, comboRowWidth); this.textWidth = comboRowWidth-20; this.searchTextEvent = searchTextEvent; } public SearchDropDown(Composite parent,DefinedSearchText.SearchTextEvent<T> searchTextEvent,int comboRowWidth){ super(parent, new ArrayList<>(), comboRowWidth); this.textWidth = comboRowWidth-20; this.searchTextEvent = searchTextEvent; } @Override protected void coverComboComposite(){ GridLayout gl_comboComposite = new GridLayout(1,true); gl_comboComposite.marginHeight = 1; gl_comboComposite.marginWidth = 1; gl_comboComposite.marginBottom = 5; gl_comboComposite.verticalSpacing = 0; comboComposite.setLayout(gl_comboComposite); comboComposite.setSize(this.comboRowWidth + 2, 40 + searchHeight); generateSearchCompoiste(comboComposite); } /** * 绘制内容区域 * @param comboComposite */ protected void generateSearchCompoiste(Composite comboComposite) { // 绘制搜索框 Composite searchComposite = new Composite(comboComposite, SWT.NONE); searchComposite.setBackground(SWTResourceManager.getWhiteColor()); GridData gd_searchComposite = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); searchComposite.setLayoutData(gd_searchComposite); GridLayout gl_searchComposite = new GridLayout(1, true); gl_searchComposite.marginWidth = 10; gl_searchComposite.marginHeight = 10; gl_searchComposite.verticalSpacing = 0; gl_searchComposite.horizontalSpacing = 0; searchComposite.setLayout(gl_searchComposite); searchText = new DefinedSearchText<T>(searchComposite, searchTextEvent, textWidth, textHeight); if (asynchronous) { searchText.setPagePerNum(pagePerNum); searchText.setPageNumNow(pageNumNow); } searchText.paint(); mentionHint = new CLabel(searchComposite,SWT.NONE); GridData gd_mentionHint = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); mentionHint.setLayoutData(gd_mentionHint); mentionHint.setBackground(SWTResourceManager.getWhiteColor()); mentionHint.setForeground(SWTResourceManager.getColor(204,204,204)); if(StringUtil.isNotNullAndEmpty(defaultMentionHint)){ mentionHint.setText(defaultMentionHint); } searchComposite.layout(true); // 绘制内容区域 searchScrollContentComposite = new ScrolledComposite(comboComposite, SWT.V_SCROLL); searchScrollContentComposite.setExpandHorizontal(true); searchScrollContentComposite.setExpandVertical(true); searchScrollContentComposite.setBackground(SWTResourceManager.getWhiteColor()); GridData gd_searchScrollContentComposite = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); searchScrollContentComposite.setLayoutData(gd_searchScrollContentComposite); generateSearchContentComposite(); } /** * 显示默认提示*/ protected void showNormalMention(){ SWTUtil.changeBorderToNormal(searchText.getContentText().getContentText()); if(StringUtil.isNotNullAndEmpty(defaultMentionHint)){ mentionHint.setForeground(SWTResourceManager.getColor(200,200,200)); mentionHint.setText(defaultMentionHint); }else{ mentionHint.setText(StringUtils.EMPTY); } } /** * 显示错误信息 * @param errorText */ protected void showErrorMention(String errorText){ SWTUtil.changeBorderToRed(searchText.getContentText().getContentText()); mentionHint.setText(errorText); mentionHint.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED)); } /** * 生成搜索区域内容composite*/ private void generateSearchContentComposite() { Composite searchContentComposite = new Composite(searchScrollContentComposite,SWT.NONE); searchScrollContentComposite.setContent(searchContentComposite); searchContentComposite.setBackground(SWTResourceManager.getWhiteColor()); GridLayout gl_searchContentComposite = new GridLayout(1, true); gl_searchContentComposite.marginWidth = 10; gl_searchContentComposite.marginHeight = 0; gl_searchContentComposite.verticalSpacing = 0; gl_searchContentComposite.horizontalSpacing = 0; searchContentComposite.setLayout(gl_searchContentComposite); //绘制内容区域 comboConenetComposite = new Composite(searchContentComposite,SWT.NONE); comboConenetComposite.setBackground(SWTResourceManager.getWhiteColor()); GridData gd_contentComposite = new GridData(SWT.FILL,SWT.FILL,true,true,1,1); comboConenetComposite.setLayoutData(gd_contentComposite); GridLayout gl_comboConenetComposite = new GridLayout(1,true); gl_comboConenetComposite.horizontalSpacing = 0; gl_comboConenetComposite.verticalSpacing = 0; gl_comboConenetComposite.marginHeight = 0; gl_comboConenetComposite.marginWidth = 0; comboConenetComposite.setLayout(gl_comboConenetComposite); searchScrollContentComposite.setData("searchComposite", comboConenetComposite); //绘制加载区域 if(asynchronous){ CLabel loadLabel = new CLabel(searchContentComposite,SWT.NONE); loadLabel.setBackground(SWTResourceManager.getWhiteColor()); GridData gd_loadComposite = new GridData(SWT.CENTER,SWT.CENTER,true,false,1,1); gd_loadComposite.minimumHeight = loadHeight; gd_loadComposite.heightHint = loadHeight; gd_loadComposite.exclude = true; loadLabel.setLayoutData(gd_loadComposite); loadLabel.setVisible(false); searchScrollContentComposite.setData("load", loadLabel); } if (!this.asynchronous) { // generateNoPageContent(); }else if(null != searchTextEvent){ //获取第一页内容,同时为滚动条添加滚动加载事件 // generatePageContent(true); searchScrollContentComposite.getVerticalBar().addListener(SWT.Selection, new Listener(){ @Override public void handleEvent(Event event) { //滚动事件 if(!finish){ generatePageContent(false); } } }); }else{ log.error(HikLog.toLog("", "no defined search event")); } } /** * 非异步加载数据时,后台查询数据,前台需要显示正在加载中*/ private void generateNoPageLoadContent(){ Composite searchContentComposite = (Composite)searchScrollContentComposite.getData("searchComposite"); for(Control control:searchContentComposite.getChildren()){ control.dispose(); } searchScrollContentComposite.setMinSize(0, 0); Composite loadComposite = new Composite(searchContentComposite,SWT.NONE); GridData gd_loadCompositel = new GridData(SWT.FILL,SWT.FILL,true,true,1,1); loadComposite.setLayoutData(gd_loadCompositel); GridLayout gl_loadComposite = new GridLayout(2,false); gl_loadComposite.marginHeight = 0; gl_loadComposite.marginWidth = 0; loadComposite.setLayout(gl_loadComposite); loadComposite.setBackground(SWTResourceManager.getWhiteColor()); CLabel mentionLabel = new CLabel(loadComposite,SWT.NONE); GridData gd_mentionLabel = new GridData(SWT.RIGHT,SWT.CENTER,true,true,1,1); mentionLabel.setLayoutData(gd_mentionLabel); mentionLabel.setText("正在加载数据"); mentionLabel.setBackground(SWTResourceManager.getWhiteColor()); ImageViewer ic = new ImageViewer(loadComposite); GridData gd_ic = new GridData(SWT.LEFT,SWT.CENTER,false,false,1,1); gd_ic.widthHint = 24; gd_ic.heightHint = 24; ic.setLayoutData(gd_ic); ImageLoader loader = new ImageLoader(); ImageData[] imageDatas = loader.load(FileUtil.loadResourceFileAsStream(Constants.INSTALLING_IMG)); ic.setImages(imageDatas, loader.repeatCount); ic.pack(); loadComposite.layout(true); } private void generatePageContent(boolean init){ this.init = init; this.searchText.setSearchExternalFilterList(searchExternalFilterList); searchText.notifyMousedownEvent(); } /** * 获取到数据之后的后续处理*/ protected void afterSearchClick(Event searchTextEvent,List<T> searchData){ boolean append = false; if(asynchronous){ append = true; } if(searchTextEvent.button == 1){ Composite searchContentComposite = (Composite)searchScrollContentComposite.getData("searchComposite"); for(Control control:searchContentComposite.getChildren()){ control.dispose(); } this.comboDataList.clear(); searchScrollContentComposite.setMinSize(0, 0); totalCount = 0; } if(CollectionUtil.isNotEmpty(searchData)){ totalCount += searchData.size(); } generateComboContent(append,searchData); this.init = false; } /** * 分页加载显示*/ private void generatePageLoadContent(){ CLabel loadLabel = (CLabel)searchScrollContentComposite.getData("load"); GridData gd_loadLabel = (GridData)loadLabel.getLayoutData(); gd_loadLabel.exclude = false; loadLabel.setText("加载中..."); loadLabel.setVisible(true); loadLabel.getParent().layout(true); } /** * 点击搜索按钮之前的加载呈现内容*/ protected void beforeSearchClick(Event event){ if(init || event.button == 1){ searchText.setSearchExternalFilterList(searchExternalFilterList); } if(this.asynchronous){ if(init || event.button == 1){ //event.button == 1 表示是点击了搜索按钮 pageNumNow = 0; Composite searchContentComposite = (Composite)searchScrollContentComposite.getData("searchComposite"); for(Control control:searchContentComposite.getChildren()){ control.dispose(); } searchScrollContentComposite.setMinSize(0, 0); this.comboDataList.clear(); } pageNumNow++; searchText.setPageNumNow(pageNumNow); finish = false; generatePageLoadContent(); }else{ searchText.setPagePerNum(Integer.MAX_VALUE); generateNoPageLoadContent(); } } /** * 在已有数据情况下绘制内容区域(将当前数据全部清空,形成新的下拉数据) * @param append 是否是追加显示*/ protected void generateComboContent(boolean append,List<T> dataList){ if(searchScrollContentComposite.isDisposed()){ return; } Composite searchContentComposite = (Composite)searchScrollContentComposite.getData("searchComposite"); if(null == this.comboDataList){ this.comboDataList = new ArrayList<>(); } if(!append){ for(Control control:searchContentComposite.getChildren()){ control.dispose(); } this.comboDataList.clear(); searchScrollContentComposite.setMinSize(0, 0); } if (CollectionUtil.isNotEmpty(dataList)) { for (T data : dataList) { generateComboItem(data); } this.comboDataList.addAll(dataList); if (this.comboDataList.size() <= 8) { comboComposite.setSize(this.comboRowWidth + 2, this.comboRowHeight * this.comboDataList.size() + 40 + searchHeight); } else { comboComposite.setSize(this.comboRowWidth + 2, this.comboRowHeight * 8 + 40 + searchHeight); } searchScrollContentComposite.setMinSize(this.comboRowWidth + 2,this.comboRowHeight * this.comboDataList.size()); if(append){ CLabel loadLabel = (CLabel)searchScrollContentComposite.getData("load"); GridData gd_loadLabel = (GridData)loadLabel.getLayoutData(); gd_loadLabel.exclude = true; loadLabel.setVisible(false); } }else if(!append){ //形成待更新内容 generateNoContentMentionComposite(searchContentComposite,this.getFilterContent(),this.comboRowWidth-30); comboComposite.setSize(this.comboRowWidth + 2, 70 + searchHeight); }else{ //异步加载数据的情况 if(CollectionUtil.isEmpty(this.comboDataList)){ generateNoContentMentionComposite(searchContentComposite,this.getFilterContent(),this.comboRowWidth-30); CLabel loadLabel = (CLabel)searchScrollContentComposite.getData("load"); GridData gd_loadLabel = (GridData)loadLabel.getLayoutData(); gd_loadLabel.exclude = true; loadLabel.setVisible(false); finish = true; comboComposite.setSize(this.comboRowWidth + 2, 70 + searchHeight); }else if(CollectionUtil.isEmpty(dataList)){ CLabel loadLabel = (CLabel)searchScrollContentComposite.getData("load"); GridData gd_loadLabel = (GridData)loadLabel.getLayoutData(); gd_loadLabel.exclude = false; loadLabel.setText("无更多数据"); loadLabel.setVisible(true); finish = true; } } relayoutScrollComposite(); } /** * 重新绘制左侧滚动区域*/ private void relayoutScrollComposite(){ Composite searchContentComposite = (Composite)searchScrollContentComposite.getData("searchComposite"); searchContentComposite.layout(true); Composite scrollContentComposite = searchContentComposite.getParent(); scrollContentComposite.layout(true); searchScrollContentComposite.setMinSize(scrollContentComposite.computeSize(SWT.DEFAULT,SWT.DEFAULT)); } protected abstract void generateNoContentMentionComposite(Composite searchContentComposite,String searchContent,int width); public int getSearchHeight() { return searchHeight; } public void setSearchHeight(int searchHeight) { this.searchHeight = searchHeight; } public boolean isAsynchronous() { return asynchronous; } public void setAsynchronous(boolean asynchronous) { this.asynchronous = asynchronous; } public int getPagePerNum() { return pagePerNum; } public void setPagePerNum(int pagePerNum) { this.pagePerNum = pagePerNum; } public int getTextWidth() { return textWidth; } public void setTextWidth(int textWidth) { this.textWidth = textWidth; } public int getTextHeight() { return textHeight; } public void setTextHeight(int textHeight) { this.textHeight = textHeight; } public void setDefaultMentionHint(String defaultMentionHint) { this.defaultMentionHint = defaultMentionHint; } public void setSearchTextEvent(DefinedSearchText.SearchTextEvent<T> searchTextEvent) { this.searchTextEvent = searchTextEvent; } public void setLoadHeight(int loadHeight) { this.loadHeight = loadHeight; } public List<Object> getSearchExternalFilterList() { return searchExternalFilterList; } /** * 添加过滤条件,条件的先后顺序需要用户自己控制*/ public void addSearchExternalFilter(Object filter){ if(null == searchExternalFilterList){ searchExternalFilterList = new LinkedList<Object>(); } searchExternalFilterList.add(filter); } public boolean replaceSearchExternalFilter(Object filter,int index){ if(null == searchExternalFilterList){ searchExternalFilterList = new LinkedList<Object>(); } if(searchExternalFilterList.size() == 0 && index == 0){ searchExternalFilterList.add(filter); return true; } if(index > searchExternalFilterList.size()-1){ log.error(HikLog.toLog("", "index > searchExternalFilterList.size()", "index","searchExternalFilterList.size()"),index,searchExternalFilterList.size()); return false; } if(index<0){ log.error(HikLog.toLog("", "index < 0", "index"),index); return false; } searchExternalFilterList.remove(index); searchExternalFilterList.add(index, filter); return true; } /** * 触发搜索,同时更换下拉框中的内容*/ public void notifySearch(){ this.init = true; this.searchText.notifyMousedownEvent(); } /** * 触发滚动条的下拉异步加载事件*/ public void notifyScrollSearch(){ if(this.asynchronous && !this.finish){ generatePageContent(false); } } public boolean isInitEmpty() { return initEmpty; } public void setInitEmpty(boolean initEmpty) { this.initEmpty = initEmpty; } /** * 获取要搜索的内容 * @return */ protected String getFilterContent(){ return (String)this.searchText.getValue(); } protected int getTotalCount() { return totalCount; } }
SearchDropDown.java 带搜索功能的通用下拉框,继承 DropDown.java。该搜索框搜索出的内容可以是在已查出所有数据基础上进行搜索,也可以是异步的分页搜索。
3.1 带搜索功能的单选下拉框
package com.view.control.select; import java.util.List; import log.HikLog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.util.StringUtil; import com.view.control.DefinedSearchText; import com.view.control.select.DefinedCommonSingleSelect.DefinedCommonSingleSelectEvent; import com.view.swt.StyleTextLink; /** * <p>下拉单选带搜索功能</p> * @version V1.0 */ public class DefinedSearchSingleSelect extends SearchDropDown<DropDownBox.Data> { private static final Logger log = LoggerFactory.getLogger(DefinedSearchSingleSelect.class); private DefinedCommonSingleSelect commonSingleSelect; private StyleTextLink.StyleTextLinkEvent linkEvent; private String noContentMention = "您可以更新获取选型数据后再进行查询"; private String linkText = "更新"; private SearchSingleSelectEvent searchEvent; public DefinedSearchSingleSelect(Composite parent, SearchSingleSelectEvent searchEvent,int comboWidth) { super(parent, null, comboWidth); commonSingleSelect = new DefinedCommonSingleSelect(parent, this); commonSingleSelect.setComboWidth(comboWidth); this.searchEvent = searchEvent; } public DefinedSearchSingleSelect(Composite parent, SearchSingleSelectEvent searchEvent,int comboWidth, int comboHeight,boolean showValue) { super(parent, null, comboWidth); commonSingleSelect = new DefinedCommonSingleSelect(parent, this); commonSingleSelect.setComboWidth(comboWidth); commonSingleSelect.setComboHeight(comboHeight); commonSingleSelect.setShowValue(showValue); this.searchEvent = searchEvent; this.showValue = showValue; } @Override public void paint() { searchTextEvent = new DefinedSearchText.SearchTextEvent<DropDownBox.Data>(){ @Override public DefinedSearchText.SearchPageResult<Data> search(Event event, String searchKeys, int pageNum, int pagePerNum, List<Object> filters) { if(null != searchEvent){ return searchEvent.search(event, searchKeys, pageNum, pagePerNum, filters); }else{ log.error(HikLog.toLog("", "no searchTextEvent")); return null; } } @Override public boolean beforeEvent(Event event,String searchKey) { if(null != searchEvent){ String verifyMsg = searchEvent.verifySearchContent(searchKey); if(StringUtil.isNotNullAndEmpty(verifyMsg)){ //校验不通过 showErrorMention(verifyMsg); return false; }else{ //校验通过 showNormalMention(); } } beforeSearchClick(event); return true; } @Override public void afterEvent(Event event, List<Data> dataList) { afterSearchClick(event,dataList); } }; commonSingleSelect.paint(); } @Override protected void comboPaint(){ super.comboPaint(); if(!this.initEmpty){ super.notifySearch(); } } @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 void setDefaultValue(String 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); } public interface SearchSingleSelectEvent{ public DefinedSearchText.SearchPageResult<Data> search(Event event, String searchKeys, int pageNum, int pagePerNum, List<Object> filters); /** * 校验输入的搜索条件是否正确 * @param searchKey * @return */ public String verifySearchContent(String searchKey); } @Override protected void generateNoContentMentionComposite(Composite searchContentComposite, String searchContent, int width) { StyledText styledText = new StyledText(searchContentComposite,SWT.WRAP|SWT.MULTI); styledText.setText(StringUtil.isNotNullAndEmpty(searchContent)?"未找到与"+searchContent+"相关的内容,"+noContentMention:"暂无数据,"+noContentMention); GridData gd_styledText = new GridData(SWT.CENTER,SWT.CENTER,true,true,1,1); gd_styledText.widthHint = width; styledText.setLayoutData(gd_styledText); styledText.setEditable(false); StyleTextLink link = new StyleTextLink(linkEvent,styledText); link.ReplaceLink(linkText); searchContentComposite.layout(true); } public void setLinkEvent(StyleTextLink.StyleTextLinkEvent linkEvent) { this.linkEvent = linkEvent; } }
DefinedSearchSingleSelect.java (搜索框+下拉框),当搜索不到关键项时,可以给出提示,并链接到别的功能
3.2 带搜索功能的多选框
package com.view.control.select; import java.util.List; import log.HikLog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.util.StringUtil; import com.view.control.DefinedSearchText; import com.view.control.select.DefinedCommonMultiSelect.DefinedCommonMultiSelectEvent; import com.view.swt.StyleTextLink; public class DefinedSearchMultiSelect extends SearchDropDown<DropDownBox.Data> { private static final Logger log = LoggerFactory.getLogger(DefinedSearchMultiSelect.class); private DefinedCommonMultiSelect commonMultiSelect; private StyleTextLink.StyleTextLinkEvent linkEvent; private String noContentMention = "您可以更新获取选型数据后再进行查询"; private String linkText = "更新"; private SearchMultiSelectEvent searchEvent; public DefinedSearchMultiSelect(Composite parent, SearchMultiSelectEvent searchEvent, int comboRowWidth) { super(parent, null, comboRowWidth); commonMultiSelect = new DefinedCommonMultiSelect(parent, this); commonMultiSelect.setChooseWidth(comboRowWidth); this.searchEvent = searchEvent; } public DefinedSearchMultiSelect(Composite parent, SearchMultiSelectEvent searchEvent, int chooseWidth, int chooseItemHeight) { super(parent, null, chooseWidth); commonMultiSelect = new DefinedCommonMultiSelect(parent, this); commonMultiSelect.setChooseWidth(chooseWidth); commonMultiSelect.setChooseItemHeight(chooseItemHeight); this.searchEvent = searchEvent; } public void paint(){ searchTextEvent = new DefinedSearchText.SearchTextEvent<DropDownBox.Data>(){ @Override public DefinedSearchText.SearchPageResult<Data> search(Event event, String searchKeys, int pageNum, int pagePerNum, List<Object> filters) { if(null != searchEvent){ return searchEvent.search(event, searchKeys, pageNum, pagePerNum, filters); }else{ log.error(HikLog.toLog("", "no searchTextEvent")); return null; } } @Override public boolean beforeEvent(Event event,String searchKey) { if(null != searchEvent){ String verifyMsg = searchEvent.verifySearchContent(searchKey); if(StringUtil.isNotNullAndEmpty(verifyMsg)){ //校验不通过 showErrorMention(verifyMsg); return false; }else{ //校验通过 showNormalMention(); } } beforeSearchClick(event); return true; } @Override public void afterEvent(Event event, List<Data> dataList) { afterSearchClick(event,dataList); } }; commonMultiSelect.paint(); } @Override protected void comboPaint(){ super.comboPaint(); if(!this.initEmpty){ super.notifySearch(); } } @Override protected void generateNoContentMentionComposite(Composite searchContentComposite,String searchContent,int width) { StyledText styledText = new StyledText(searchContentComposite,SWT.WRAP|SWT.MULTI); styledText.setText(StringUtil.isNotNullAndEmpty(searchContent)?"未找到与"+searchContent+"相关的内容,"+noContentMention:"暂无数据,"+noContentMention); GridData gd_styledText = new GridData(SWT.CENTER,SWT.CENTER,true,true,1,1); gd_styledText.widthHint = width; styledText.setLayoutData(gd_styledText); styledText.setEditable(false); StyleTextLink link = new StyleTextLink(linkEvent,styledText); link.ReplaceLink(linkText); searchContentComposite.layout(true); } @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(); } public void setLinkEvent(StyleTextLink.StyleTextLinkEvent linkEvent) { this.linkEvent = linkEvent; } public void setNoContentMention(String noContentMention) { this.noContentMention = noContentMention; } public void setLinkText(String linkText) { this.linkText = linkText; } public interface SearchMultiSelectEvent{ public DefinedSearchText.SearchPageResult<Data> search(Event event, String searchKeys, int pageNum, int pagePerNum, List<Object> filters); /** * 校验输入的搜索条件是否正确 * @param searchKey * @return */ public String verifySearchContent(String searchKey); } /** * 获取选择的值 */ @SuppressWarnings("unchecked") public List<DropDownBox.Data> getValue(){ return (List<DropDownBox.Data>) commonMultiSelect.getValue(); } }
DefinedSearchMultiSelect.java 功能类似3.1
package com.view.swt; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Point; import com.util.CollectionUtil; public class StyleTextLink { private List<Point> linkList = new ArrayList<>(); private Color BLUE;// 链接颜色 private StyleTextLinkEvent event; private StyledText st; public StyleTextLink(StyleTextLinkEvent event, StyledText st) { this.event = event; this.st = st; } public void ReplaceLink(String linkText) {// 给StyleText加链接样式 BLUE = SWTResourceManager.getColor(SWT.COLOR_BLUE); StringBuffer text = new StringBuffer(st.getText()); int startLink = text.indexOf(linkText); int offset = 0; int length = linkText.length(); while (startLink != -1) {// 循环找出文本内所有连接 int endLink = startLink + linkText.length();// 判断结束位置 int start = startLink + offset; int end = endLink + offset; Point p = new Point(start, end); linkList.add(p); StyleRange style1 = new StyleRange();// 生成链接的样式 style1.start = startLink + offset;// 连接开始坐标 style1.length = length;// 长度 style1.underline = true;// 下划线 style1.foreground = BLUE;// 颜色 style1.underlineStyle = SWT.UNDERLINE_LINK; st.setStyleRange(style1); text.delete(startLink, endLink); int s = text.indexOf(linkText); offset += endLink - startLink; startLink = s; } if (event != null) { st.addMouseListener(new MouseAdapter() {// 加入鼠标点击链接监听事件 public void mouseDown(MouseEvent e) { Point p = new Point(e.x, e.y);// 鼠标按下的坐标 try { int n = st.getOffsetAtLocation(p);// 找出相对文本的位置 StyleRange style = st.getStyleRangeAtOffset(n); if (style != null && style.underline && style.foreground.equals(SWTResourceManager.getColor(SWT.COLOR_BLUE))) {// 判断样式是否是连接的样式 if (CollectionUtil.isNotEmpty(linkList)) { for (Point pt : linkList) { if (pt.x <= n && pt.y >= n) {// 对比坐标位置是否在连接文本范围内 event.linkEvent(); st.getShell().forceFocus(); } } } } } catch (Exception e1) { } } }); } } public interface StyleTextLinkEvent { void linkEvent(); } }
StyleTextLink.java 呈现搜索框中搜素不到内容的链接
其它下拉框见下章节
以上是关于自定义SWT控件三之搜索功能下拉框的主要内容,如果未能解决你的问题,请参考以下文章