一個困擾我許久的問題解決了


<!--這是我工程的配置文件,用的是動態菜單形式完成查詢功能。>

<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();
	            }

結果,成功了哭


那麼問題來了,這是爲什麼??


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章