swt自动生成menu解决思路

swt自动生成menu
这两天在学习swt,打算用swt做个工具出来。
swt的组件构造一般都依赖于Composite parent对象,给我感觉总写起代码来总有那么一点点不太舒服。

swt的Menu和MenuItem要是比较*方便的构造出来还确实是不太利索。这里自己定义了一个xml格式菜单数据
然后自动生成菜单。以下是XML格式
XML code

<?xml version="1.0" encoding="UTF-8"?>

<!-- menu表示菜单,name唯一标识菜单,menuItem中text是显示,listener是监听 -->
<menus>
    <menu name="login">
        <menuItem listener="Login" text="Login">
        </menuItem>
        <menuItem listener="Logout" text="Logout">
        </menuItem>
    </menu>
    <menu name="edit">
        <menu name="edit">
            <menuItem listener="22222" text="22222">
            </menuItem>
        </menu>
        <menuItem listener="Listen1" text="text1">

        </menuItem>
        <menuItem listener="2" text="text2">
        </menuItem>
        <menuItem listener="3" text="3">
        </menuItem>
    </menu>
    <menu name="source">
        <menuItem listener="5" text="5">
        </menuItem>
        <menuItem listener="6" text="6">
        </menuItem>
        <menuItem listener="7" text="7">
        </menuItem>
    </menu>
</menus>


这是生成的效果图


用递归写了一个,以下是生成菜单的关键类
Java code

package com.haidi.ui.menu;

import java.net.MalformedURLException;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;

import com.haidi.Viewer;
import com.haidi.util.ReadXML;
import com.haidi.util.Util;

public class ViewerMenu {
    
    private static ViewerMenu viewerMenu;    //ViewerMenu实例,单例
    private Menu mainMenu;    //shell当中menu

    /**
     * 构造函数私有,外部无法通过构造函数获取实例
     */
    private ViewerMenu() {
    }

    /**
     * 获取ViewerMenu实例(单例)
     * 
     * @return
     */
    public static ViewerMenu getInstance() {
        if (viewerMenu == null) {
            viewerMenu = new ViewerMenu();
        }
        return viewerMenu;
    }

    /**
     * 从menu的xml配置文件当中获取Menu
     * 
     * @return
     */
    public Menu getMenuFromFile() {
        mainMenu = new Menu(Viewer.shell, SWT.BAR);

        Document document = null;
        try {
            document = ReadXML.read(getMenuFileURL() + Util.FILE);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        Element root = ReadXML.getRootElement(document);
        for (Iterator i = root.elementIterator(); i.hasNext();) {
            Element element = (Element) i.next();
            
            createByElementMenu(element, mainMenu);
        }
        return mainMenu;
    }

    /**
     * 根据Element和本级menu去创建Menu
     * 
     * @param element
     * @param menu
     */
    private void createByElementMenu(Element element, Menu menu) {
        if(element.getName()==Util.MENU){
            MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
            menuItem.setText(element.attributeValue(Util.MENUNAME));
            
            Menu fileMenu = new Menu(Viewer.shell, SWT.DROP_DOWN);
            menuItem.setMenu(fileMenu);
            
            for (Iterator i = element.elementIterator(); i.hasNext();){
                Element subElement = (Element) i.next();
                createByElementMenu(subElement,fileMenu);
            }
        }
        else if(element.getName()==Util.MENUITEM){
            MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
            menuItem.setText(element.attributeValue(Util.MENUITEMTEXT));
        }
    }

    /**
     * 获取menus配置文件的url(暂且拟定classpath)
     * 
     * @return
     */
    private String getMenuFileURL() {
        String url = this.getClass().getClassLoader().getSystemResource("")
                .toString();
        url = url.replace("\\", "/");

        // 去除前缀file:/
        if (url.length() > 6) {
            url = url.substring(6);
        }
        return url;
    }
}