当前位置: 代码迷 >> Eclipse >> swt自动生成menu解决思路
  详细解决方案

swt自动生成menu解决思路

热度:32   发布时间:2016-04-23 14:11:44.0
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;    }}
  相关解决方案