<?xml version="1.0" encoding="utf-8"?> <menubar name="ourMenu"> <!--File--> <menu name="file" text="File" mnemonic="F"> <menu name="new" text="New" mnemonic="N"> <menuitem name="doc" text="Document" image="./data/MenuXML/img1.jpg"/> </menu> <menuitem name="open" text="Open..." mnemonic="O" accelerator="control O"/> <separator/> <menu name="download" text="Download as"> <menuitem name="msword" text="Microsoft Word (.docx)"/> </menu> <separator/> <menuitem name="print" text="Print" mnemonic="P" accelerator="control P"/> </menu> <!--Edit--> <menu name="edit" text="Edit" mnemonic="d"> <menuitem name="undo" text="Undo" image="./data/MenuXML/img1.jpg" accelerator="control Z" isEnabled="false"/> <menuitem name="redo" text="Redo" image="./data/MenuXML/img1.jpg" accelerator="control Y" isEnabled="false"/> <separator/> <menuitem name="cut" text="Cut" image="./data/MenuXML/img1.jpg" accelerator="control X" isEnabled="false"/> <menuitem name="copy" text="Copy" image="./data/MenuXML/img1.jpg" accelerator="control C" isEnabled="false"/> <menuitem name="paste" text="Paste" image="./data/MenuXML/img1.jpg" accelerator="control V" isEnabled="false"/> </menu> <!--Format--> <menu name="format" text="Format" mnemonic="o"> <menu name="styles" text="Paragraph styles"> <menu name="normalText" text="Normal text"> <menuitem name="applyNormText" text="Apply normal text" accelerator="control alt 0"/> </menu> <menu name="heading" text="Heading"> <menuitem name="applyHeading" text="Apply heading" accelerator="control alt 1"/> </menu> <separator/> <menu name="options" text="Options" image="./data/MenuXML/img1.jpg"> <menuitem name="saveOptions" text="Save options"/> </menu> </menu> </menu> <!--Help--> <menu name="help" text="Help" mnemonic="H"> <menuitem name="issue" text="Report an issue"/> <menuitem name="abuse" text="Repor abuse"/> <separator/> <menuitem name="shortcuts" text="Keyboard shortcuts" accelerator="control SLASH"/> </menu> </menubar>
public class XMLMenuHandler extends DefaultHandler { private Map menuMap = new HashMap(); private JMenuBar menuBar; private LinkedList menuList = new LinkedList(); @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { // (menu, menubar, menuitem separator) if(qName.equals("menu")) { parseMenu(atts); } else if(qName.equals("menubar")) { parseMenubar(atts); } else if(qName.equals("menuitem")) { parseMenuitem(atts); } else if(qName.equals("separator")) { parseSeparator(); } } // </menu> . @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("menu")) { menuList.removeFirst(); } } private void parseSeparator() { // ((JMenu)menuList.getFirst()).addSeparator(); } private void parseMenuitem(Attributes atts) { // JMenuItem menuItem = new JMenuItem(); String menuItemName = atts.getValue("name"); // parseAttributes(menuItem, atts); menuMap.put(menuItemName, menuItem); // ((JMenu)menuList.getFirst()).add(menuItem); } private void parseMenubar(Attributes atts) { // JMenuBar tempMenuBar = new JMenuBar(); String menuBarName = atts.getValue("name"); menuMap.put(menuBarName, tempMenuBar); menuBar = tempMenuBar; } private void parseMenu(Attributes atts) { // JMenu menu = new JMenu(); String menuName = atts.getValue("name"); // parseAttributes(menu, atts); menuMap.put(menuName, menu); // , -. if (menuList.size() == 0) { menuBar.add(menu); } else { // ((JMenu)menuList.getFirst()).add(menu); } // - menuList.addFirst(menu); } private void parseAttributes(JMenuItem item, Attributes atts) { // String text = atts.getValue("text"); String image = atts.getValue("image"); String mnemonic = atts.getValue("mnemonic"); String accelerator = atts.getValue("accelerator"); String isEnabled = atts.getValue("isEnabled"); // XML item.setText(text); if(image != null) { item.setIcon(new ImageIcon(image)); } if(mnemonic != null) { item.setMnemonic(mnemonic.charAt(0)); } if(accelerator != null) { item.setAccelerator(KeyStroke.getKeyStroke(accelerator)); } if(isEnabled != null) { item.setEnabled(Boolean.parseBoolean(isEnabled)); } } public Map getMenuMap() { return menuMap; }
public class XMLMenuParser { //XML, private InputSource inputSource; //XML private SAXParser saxParser; // XML private XMLMenuHandler xmlMenuHandler; public XMLMenuParser(InputStream inputStream) { // XML XML . try { Reader reader = new InputStreamReader(inputStream); inputSource = new InputSource(reader); saxParser = SAXParserFactory.newInstance().newSAXParser(); xmlMenuHandler = new XMLMenuHandler(); } catch (Exception e) { System.out.println("Something went wrong during SAXParser initialization: " + e.getMessage()); throw new RuntimeException(e); } } public void parseXML() throws IOException, SAXException { saxParser.parse(inputSource, xmlMenuHandler); } public JMenuBar getMenuBar(String name) { return (JMenuBar)xmlMenuHandler.getMenuMap().get(name); } }
public class XMLMenuCreator extends JFrame { public XMLMenuCreator() { super("XML Menu Creator"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); try { FileInputStream in = new FileInputStream("./data/MenuXML/menu.xml"); XMLMenuParser xmlParser = new XMLMenuParser(in); xmlParser.parseXML(); //, XML , ( <menubar>), // UI setJMenuBar(xmlParser.getMenuBar("ourMenu")); } catch (Exception e) { System.out.println("Exception: " + e.getMessage()); } setSize(200, 200); setVisible(true); } }
Source: https://habr.com/ru/post/151403/