XMLMenu.java import java.io.File;import java.util.Iterator;import org.dom4j.*;import org.dom4j.io.SAXReader;import org.eclipse.swt.SWT;import org.eclipse.swt.events.*;import org.eclipse.swt.graphics.Point;import org.eclipse.swt.layout.GridLayout;import org.eclipse.swt.widgets.*;// Created : 2007-6-9 下午05:18:35/** *//** * 测试读取XML文件生成菜单 * * @author maoj */public class XMLMenu ...{ private Shell shell; private Document doc; private Menu menuBar; public XMLMenu(Shell sShell, File file) throws DocumentException ...{ doc = new SAXReader().read(file); shell = sShell; menuBar = crateBarMenu("/otak/UI/Menu/Main"); shell.setMenuBar(menuBar); System.out.println(doc.valueOf("/otak/UI/Menu/Item/Item/Item/@name")); } /** *//** * 创建窗口主菜单 * * @param xpath * @return 主菜单 */ public Menu crateBarMenu(String xpath) ...{ Node node = DocumentHelper.createXPath(xpath).selectSingleNode(doc); Menu mainMenu = new Menu(shell, SWT.BAR); if (node instanceof Element) ...{ Element element = (Element) node; for (Iterator iter = element.elementIterator(); iter.hasNext();) ...{ Element child = (Element) iter.next(); createMenu(mainMenu, child); } } return mainMenu; } /** *//** * TODO 创建弹出菜单 * * @param xpath * @return 弹出菜单 */ public Menu cratePopupMenu(XPath xpath) ...{ return null; } /** *//** * 创建菜单 * * @param menu * 父菜单 * @param element * XML树元素 */ private void createMenu(Menu menu, Element element) ...{ boolean isBranch = (element.nodeCount() > 0) ? true : false; Menu subMenu; // 是分支菜单需递归创建下级菜单 if (isBranch) ...{ subMenu = createMenuItem(menu, element, true); for (Iterator iter = element.elementIterator(); iter.hasNext();) ...{ Element child = (Element) iter.next(); createMenu(subMenu, child); } } else ...{ createMenuItem(menu, element, false); } } private Menu createMenuItem(Menu menu, final Element element, boolean isBranch) ...{ MenuItem mi; // 判断MenuItem的样式 if (isBranch) ...{ mi = new MenuItem(menu, SWT.CASCADE); } else ...{ String type = element.attributeValue("type"); if (type != null && type.length() > 0) ...{ mi = new MenuItem(menu, getStyle(type)); } else ...{ mi = new MenuItem(menu, SWT.PUSH); } } // 菜单点击事件测试 mi.addSelectionListener(new SelectionListener() ...{ public void widgetDefaultSelected(SelectionEvent e) ...{ } public void widgetSelected(SelectionEvent e) ...{ System.out.println(e.widget); } }); // 将XML中的属性赋值给MenuItem for (Iterator iter = element.attributeIterator(); iter.hasNext();) ...{ Attribute attr = (Attribute) iter.next(); String temp = attr.getName(); if (temp.equalsIgnoreCase("text")) ...{ mi.setText(attr.getValue()); } else if (temp.equalsIgnoreCase("accelerator")) ...{ mi.setAccelerator(getAccelerator(attr.getValue())); mi.setText(mi.getText() + ' ' + attr.getValue()); } } // 是分支还需创建下级Menu做为返回参数 if (isBranch) ...{ Menu subMenu = new Menu(mi); mi.setMenu(subMenu); return subMenu; } else ...{ return null; } } /** *//** * 将快捷键定义从字符串转为数字 * * @param acc * 快捷键 * @return */ private int getAccelerator(String acc) ...{ String[] part = acc.split("/+"); int rtn = 0; for (String temp : part) ...{ if (temp.equalsIgnoreCase("CTRL")) ...{ rtn = rtn | SWT.CTRL; } else if (temp.equalsIgnoreCase("ALT")) ...{ rtn = rtn | SWT.ALT; } else if (temp.equalsIgnoreCase("SHIFT")) ...{ rtn = rtn | SWT.SHIFT; } else ...{ if (temp.length() == 1) ...{ rtn = rtn | temp.getBytes()[0]; } } } return rtn; } /** *//** * 将定义MenuItem样式的字符串转为数据 * * @param style * 样式 * @return */ private int getStyle(String style) ...{ if (style.equalsIgnoreCase("CASCADE")) ...{ return SWT.CASCADE; } else if (style.equalsIgnoreCase("PUSH")) ...{ return SWT.PUSH; } else if (style.equalsIgnoreCase("CHECK")) ...{ return SWT.CHECK; } else if (style.equalsIgnoreCase("RADIO")) ...{ return SWT.RADIO; } else if (style.equalsIgnoreCase("SEPARATOR")) ...{ return SWT.SEPARATOR; } else ...{ return SWT.NONE; } } /** *//** * @param args * @throws DocumentException */ public static void main(String[] args) throws DocumentException ...{ Display display = Display.getDefault(); Shell sShell = new Shell(display); sShell.setText("Shell"); sShell.setLayout(new GridLayout()); sShell.setSize(new Point(300, 200)); new XMLMenu(sShell, new File( "D:/MyProject/Java/otak/classes/res.xml")); sShell.open(); while (!sShell.isDisposed()) ...{ if (!display.readAndDispatch()) display.sleep(); } display.dispose(); }} res.xml <?xml version="1.0" encoding="UTF-8"?><!--Warning : DO NOT modify this file unless you indeed know what you done, that maybe make program maze and crash! --><otak author="yagumo" modified="2007-6-9"> <UI> <Menu> <Main> <Item name="File" text="File"> <Item name="Open" text="Open..."> <Item name="ASC" text="ASC" type="RADIO"/> <Item name="BIN" text="BIN" type="RADIO"/> </Item> <Item type="SEPARATOR"/> <Item name="Exit" text="Exit" accelerator="CTRL+X"/> </Item> <Item name="Help" text="Help"> <Item name="About" text="About..."/> </Item> </Main> <Popup/> </Menu> </UI></otak>