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 >