swt自动生成menu解决思路
swt自动生成menu
这两天在学习swt,打算用swt做个工具出来。
swt的组件构造一般都依赖于Composite parent对象,给我感觉总写起代码来总有那么一点点不太舒服。
swt的Menu和MenuItem要是比较自由方便的构造出来还确实是不太利索。这里自己定义了一个xml格式菜单数据
然后自动生成菜单。以下是XML格式
这是生成的效果图
用递归写了一个,以下是生成菜单的关键类
这两天在学习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; } }