一个困扰我许久的问题解决了

原创 2016年09月28日 13:45:20
<!--这是我工程的配置文件,用的是动态菜单形式完成查询功能。>

<plugin>
        <extension   point="org.eclipse.ui.menus">
         <menuContribution
            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
            <menu    label = "企业电子数据库">
           
            <menu    label = "法规标准库">
            <dynamic
                 class = "com.uds.inoherb.MyDynamicMenu"
                 id = "com.uds.inoherb.MyDynamicMenu">
            </dynamic>            
            </menu>
            
            <menu    label = "原料标准库"> 
            <dynamic
               class = "com.uds.inoherb.MyDynamicMenu2"
               id = "com.uds.inoherb.MyDynamicMenu2">
            </dynamic>
            </menu>
            </menu>
         </menuContribution>
        </extension>
</plugin>



读取本地xml配置文件,获取节点属性,动态的生成菜单和建立查询。
/**
 * 封装在一起的操作类和其方法
 * @author zhaoyao
 *
 */
public class MenuOptionManager{
	
	//初始化 parseXmlPojo()
	private List<MenuObjManage> m_parseXmlPojo;
	
	public MenuOptionManager(){
		m_parseXmlPojo = parseXmlPojo();
	}
	
	public final TCSession getSession(){
		AbstractAIFUIApplication app = AIFUtility.getCurrentApplication();
		TCSession session = (TCSession) app.getSession();
		return session;
	}
	
	public final TcSearchUI getTcSearchUI(){
		TcSearchUI UI = new TcSearchUI();
		return UI;
	}

	public  String getItemName(int i,int j){
		return this.m_parseXmlPojo.get(0).getGroupObjList().get(i)
				.getItemObjList().get(j).getItemName();
	}
	

	public String getSearchName(int i,int j){
		return this.m_parseXmlPojo.get(0).getGroupObjList().get(i)
				.getItemObjList().get(j).getConditionObj().get(0).getSearchName();
	}

	public  Map<String,String> getSearchInfo(int i,int j){
		return this.m_parseXmlPojo.get(0).getGroupObjList().get(i)
				.getItemObjList().get(j).getConditionObj().get(0).getSearchInfoMap();
	}
	
	//返回第i个group节点下的Item对象集合
	public List<Item> getItemList(int i){
		return m_parseXmlPojo.get(0).getGroupObjList().get(i).getItemObjList();
	}
	
	

	
	/**
	 * @param 查询,用于TcSearchUI的performSearch()方法,显示一个searchResultView
	 * @param searcherName :查询的组件名称     
	 * @param Map          :对应零组件下的属性map
	 */
	public  TCComponentSearch SearchComponents(TCSession session, String searcherName,
			java.util.Map<String,String> searchInfo) throws TCException {
		//查询数据 
		String QUERY_CLASS = searcherName;
		//获取查询 type
		TCComponentQueryType typeComponent = (TCComponentQueryType) session.getTypeComponent("ImanQuery");
		TCComponentQuery query = null;
		// 根据查询名称获取到相关查询
		TCComponent queryComponent = typeComponent.find(QUERY_CLASS);
		if (queryComponent == null) {
			throw new TCException("未找到查询"+QUERY_CLASS+",请联系管理员配置!");
		}
		query = (TCComponentQuery) queryComponent;
		//查询条件                
		Set<String> keySet = searchInfo.keySet();
		String[] proNames = keySet.toArray(new String[keySet.size()]);
		Collection<String> valSet = searchInfo.values();
		String[] values = valSet.toArray(new String[valSet.size()]);
		// 获取查询结果
		//TCComponent[] results = query.execute(proNames, values);
		
		//初始化TCComponentSearch构造方法
		TCComponentSearch searchQuery = new TCComponentSearch(searcherName, query, proNames, values, false, 0);
		return searchQuery;
	}
	
	/**
	 * 遍历解析XML文件,并把结果封装到MyMenu的集合中返回
	 */
	public  List<MenuObjManage> parseXmlPojo(){
		List<MenuObjManage> myMenuList = null;
		try{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		//获取Preference信息
		TCPreferenceService service = this.getSession().getPreferenceService();
		
		String TemplatePath = service.getStringValue("UDS_enterprise_database_config_path");
		InputStream inStream = new FileInputStream(TemplatePath);
		Document document = builder.parse(inStream);
		//得到要获取的所有Menu节点,通过每个节点,获取Menu内容数据 
		NodeList list = document.getElementsByTagName("Menu");
		//定义返回的MyMenu集合
		myMenuList = new ArrayList<MenuObjManage>();
		
		for (int i = 0;i<list.getLength(); i++) {
			MenuObjManage myMenu = new MenuObjManage();
			//得到节点Menu
			Element e = (Element)list.item(i);//Menu为根节点,只有一个,为item(0)
			//得到当前节点的所有孩子节点	:menuName,Group,Group
			NodeList childList = e.getChildNodes();
			//遍历Menu节点,并将数据封装到Menu对象中
			for (int j = 0; j < childList.getLength(); j++) {
				Node node = childList.item(j);
				switch(node.getNodeName()){
				case "menuName":
					String menuName = node.getTextContent().trim();
					myMenu.setMenuName(menuName);
					break;
				case "Group":
					Group group = myMenu.new Group();
					//得到Group节点的所有孩子节点:groupName,Item,Item...
					NodeList nodeList1 = node.getChildNodes();
					//遍历Group节点,并将数据封装到Group对象中
					for (int k = 0; k < nodeList1.getLength(); k++) {
						Node node2 = nodeList1.item(k);
						switch(node2.getNodeName()){
						case "groupName":
							String groupName = node2.getTextContent().trim();
							group.setGroupName(groupName);
							break;
						case"Item":
							Item item = group.new Item();
							//得到Item节点下的所有孩子节点,itemName,Condition
							NodeList nodeList2 = node2.getChildNodes();
							//遍历Item节点,并将数据封装到Item对象中
							for (int l = 0; l < nodeList2.getLength(); l++) {
								Node node3 = nodeList2.item(l);
								switch(node3.getNodeName()){
								case "itemName":
									String itemName = node3.getTextContent().trim();
										item.setItemName(itemName);
									break;
								case"Condition":
									Condition condition = item.new Condition();
									//得到Condition节点下的所有孩子节点:searchName,searchInfo
									NodeList nodeList3 = node3.getChildNodes();
									//遍历Condition节点,获取searchName值
									for (int m = 0; m < nodeList3.getLength(); m++) {
										Node node4 = nodeList3.item(m);
										switch(node4.getNodeName()){
										case "searchName":
											String searchName = node4.getTextContent().trim();
												condition.setSearchName(searchName);
											break;
										case "searchInfo":
											//遍历searchInfo节点下的所有孩子节点:put
											NodeList nodeList4 = node4.getChildNodes();
											Map<String,String> putInfo = new HashMap<>();
											//遍历searchInfo节点下的put子节点
											for (int n = 0; n < nodeList4.getLength(); n++) {
												//得到每个put子节点
												Node node5 = nodeList4.item(n);
												switch(node5.getNodeName()){
												case "put":
													//获得put节点下的所有孩子节点
													NodeList nodeList5 = node5.getChildNodes();
													List<String> arr = new ArrayList<>();
													List<String> arr2 = new ArrayList<>();
													//遍历 put节点下的子节点
													for (int o = 0; o < nodeList5.getLength(); o++) {
														Node node6 = nodeList5.item(o);
														switch(node6.getNodeName()){
														case "putName":
															String name = node6.getTextContent().trim();
															arr.add(name);
															break;
														case "putValue":
															String value =node6.getTextContent().trim();
															arr2.add(value);
															break;
														}
													}
													for (int p = 0; p < arr.size(); p++) {
															putInfo.put(arr.get(p).toString(),arr2.get(p).toString());
													}
											    }
											}
											//将Put节点下的键值队集合封装到Condition中
											condition.setSearchInfoMap(putInfo);
										}
									}
									//将Condition对象集合封装到Item中
									item.addCondition(condition);
								}
							}
							//将Item对象集合封装到Group中
							group.addItem(item);
						}
					}
					//将Group对象集合封装到Menu中
					myMenu.addGroup(group);
				}
			}
			//将Menu对象添加到List集合中
			myMenuList.add(myMenu);
			myMenu = null;
			
		}
			 } catch (ParserConfigurationException e) {  
	                e.printStackTrace();  
	            } catch (SAXException e) {
	                e.printStackTrace();
	           <span style="background-color: rgb(255, 0, 0);"><span style="color:#FFFF66;"> } catch (IOException e) {
	                e.printStackTrace()
	            }</span></span>
		//返回Menu对象集合:Menu中封装了其下的所有孩子节点对象的数据,可调用获取任何节点下的数据
		return myMenuList;
	}

	
}




这是配置文件对应的执行函数,我查看的源代码,发现这个ContributionItem抽象接口是用SWT的形式搭起来的。

<pre name="code" class="java">public class MyDynamicMenu extends ContributionItem {
	
	public MyDynamicMenu(){
		
	}
	public MyDynamicMenu(String id){
		super(id);
	}
	
	public void fill(final Menu menu,final int index){

		final MenuOptionManager temp = new MenuOptionManager();	 
		//获得第一组Group节点下的所有Item
		MenuItem[] menuItemList = new MenuItem[temp.getItemList(0).size()];
		for (int i = 0; i < menuItemList.length; i++)
		{
			final int j;
			j = i;
			//判断itemName是否存在
			if (temp.getItemName(0, i) == null || temp.getItemName(0, i) == ""){
				temp.itemNameExcpInfo();
			}else{
				//新建动态菜单
				MenuItem item = new MenuItem(menu, index);
				//设置菜单名称
				item.setText(temp.getItemName(0, i));
				//菜单的响应
				item.addSelectionListener(new SelectionAdapter(){
					public void widgetSelected(SelectionEvent e){
						//获得搜索名称
						String searchName = temp.getSearchName(0, j);
						//获得搜索下的属性和属性值
						Map<String, String> searchInfo = temp.getSearchInfo(0, j);
						try {
							//得到session
							TCSession session = temp.getSession() ;
							//将从XML文件读到的数据初始化到TCComponentSearc中
							TCComponentSearch tmpResults = temp.SearchComponents(session, searchName, searchInfo);
							//初始化SearchConfig
							SearchConfig searchConfig = new SearchConfig(session);
							//初始化TcSearchUI
							TcSearchUI searchUI = temp.getTcSearchUI();
							//执行搜索
							searchUI.performSearch(tmpResults, searchConfig);
							//显示搜索结果视图
							searchUI.activateSearchResultView();
						} catch (TCException e1) {
							e1.printStackTrace();
						}
					
					}
				});
			}
		}
	}
}




我如果在这里用Swing的方法弹出消息对话框,则系统会直接卡死,这一块纠结很久,我一度以为我这第一个动态菜单版本写的很烂,是不是用fill()主程序的方法就是错的。。。

catch (IOException e) {
	                e.printStackTrace();
	                JOptionPane.showMessageDialog(null, "文件路径不正确!请检查", "alert", JOptionPane.ERROR_MESSAGE);
	            }


直到我查看ContributiinItem的源代码,发现居然是jface,居然是SWT来构建界面的,这时候我在想是不是不能在SWT的监听事件下直接使用AWT和Swing的控件

<span style="background-color: rgb(255, 0, 0);">package org.eclipse.jface.action;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;</span>

public abstract class ContributionItem implements IContributionItem {
	private String id;
	private boolean visible;
	private IContributionManager parent;

	protected ContributionItem() {
		this(null);
	}

	protected ContributionItem(String id) {
		this.id = null;

		this.visible = true;

		this.id = id;
	}

	public void dispose() {
	}

	public void fill(Composite parent) {
	}

	public void fill(Menu menu, int index) {
	}

	public void fill(ToolBar parent, int index) {
	}

	public void fill(CoolBar parent, int index) {
	}

	public void saveWidgetState() {
	}

	public String getId() {
		return this.id;
	}

	public IContributionManager getParent() {
		return this.parent;
	}

	public boolean isDirty() {
		return isDynamic();
	}

	public boolean isEnabled() {
		return true;
	}

	public boolean isDynamic() {
		return false;
	}

	public boolean isGroupMarker() {
		return false;
	}

	public boolean isSeparator() {
		return false;
	}

	public boolean isVisible() {
		return this.visible;
	}

	public void setVisible(boolean visible) {
		this.visible = visible;
	}

	public String toString() {
		return super.getClass().getName() + "(id=" + getId() + ")";
	}

	public void update() {
	}

	public void setParent(IContributionManager parent) {
		this.parent = parent;
	}

	public void update(String id) {
	}

	public void setId(String itemId) {
		this.id = itemId;
	}
}

想到这个,我就加了一段SWT的消息对话框。

public void filePathExcpInfo(){
		Display display = Display.getDefault();
		Shell shell = new Shell(display,SWT.NONE);
		MessageBox message = new MessageBox(shell);
		message.setMessage("路径不正确,请检查路径!");
		message.open();
	}
	

catch (IOException e) {
	                e.printStackTrace();
	                this.filePathExcpInfo();
	            }

结果,成功了哭


那么问题来了,这是为什么??


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

30个问题解决预算困扰

  • 2013年06月20日 21:13
  • 32KB
  • 下载

PAT Basic Level 1018. 锤子剪刀布 (20) 及最后一个测试点运行超时问题解决

1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard...

Tomcat的项目在windows下能访问而在linux下却不能访问的一个问题解决

1、问题描述 今天把windows下部署的SSH项目复制到linux的tomcat服务器上,发现怎么访问都是报404错误,而此前部署到windows上的tomcat完全可以访问,而且我之前在linu...
  • SQ_Bang
  • SQ_Bang
  • 2017年02月25日 18:16
  • 1529

【问题解决】优化一个double数的exponent次方

double Pow(double base,int exponent); 优化之前的次方算法是将i从1遍历到exponent,ret *=ret; 代码如下double PowerWithUnsi...
  • Cheeet
  • Cheeet
  • 2017年04月22日 11:23
  • 121

下位机UART串口跟PC端RS232通信不上的一个问题解决

UART串口TTL电平信号波形分析: 本来程序里是发两个字节的,但示波器只抓到一个字节,...

多个地方同时向一个文件读写的互斥问题解决方案

场景:多个地方同时向一个文件写数据,如何保持写数据的互斥性。
  • x_yp
  • x_yp
  • 2011年02月22日 20:38
  • 4181

ajaxFileupload只能选择一个文件问题解决

最近项目中有个文件上传的,还是异步上传的,所以就找到了ajaxFileUpload这个方案。 解决了异步上传问题,却发现此方案有一个问题:上传完文件,如果想更改重新选择上传另外一个文件却不行,必须刷...

由安卓开发中的一个坑引发的问题解决之道浅析

由安卓开发中的一个坑引发的问题解决之道浅析

Apache2.2+svn1.7 的一个问题解决

原创文章,转载请注明出处:http://www.aj2ee.com 在自己电脑上写项目,也习惯性的提交到SVN,好让自己对之前写的代码有所备份。 昨天修改完自己的项目,用MyEclipse的s...

javaEE异常总结——更换工作空间向同一个tomcat上部署同一个项目时出现问题解决

我的一个项目在我的一个工作空间发布,没问题,正常能够跑起来,但是我把项目copy到另一个工作空间,然后发布到tomcat(同一个tomcat,前一个工作空间一个remove deployment,也就...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个困扰我许久的问题解决了
举报原因:
原因补充:

(最多只允许输入30个字)