平常在做菜单的时候,都是先生成菜单条,然后根据需要生成菜单,在每个菜单中再根据需要来添加需要的菜单项,这个过程很明了,但是有一点不好,就是代码看起来要比较混乱和繁杂。


而xml能够很好的管理这些条目,并且如果把这些数据装载在xml中,从xml中转化后加载在菜单条上,也能够很方便以后的修改和维护。并且,我们能够很轻易就发现,我们需要构建的菜单也跟xml的格式很相近,所以,我今天实现一个用xml来完成菜单条的想法。


首先,构建一个简单的菜单条的xml文件,如下:


<?xml version="1.0" encoding="UTF-8"?>

   <MenuBar>

       <Menu name="file" value="文件">

           <MenuItem name="new" value="新建">

           </MenuItem>

   </Menu>

       <Menu name="edit" value="编辑">

           <MenuItem name="delete" value="删除">

           </MenuItem>

       </Menu>

   </MenuBar>


在这个xml文件中,有一个根节点,叫做MenuBar,然后他有两个子节点,分别叫做file和edit,他们都有对应的该名字的值,这两个就是要加的菜单。


而每个菜单下,例如file下,还有名字为new,值为新建的菜单项,也就是要加载在file菜单上的菜单项。


现在结构已经很清楚了,那么问题是我们应该怎样把这些东西用JMenuBar、JMenu、JMenuItem来实现呢?



首先来分析下:


1.对于每个节点,我们发现有name和value两个属性,那么可以考虑用一个映射来实现这个结构;

2.对于每个节点的子节点和父节点的关系,而且每个Menu的子节点个数不一样,所以可以用ArrayList来装该数据。


在此呢,我将每个节点的数据简化了一下,使得xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<MenuBar>

    <Menu name="文件">

        <MenuItem name="新建">

         </MenuItem>

    </Menu>

     <Menu name="编辑">

       <MenuItem name="删除">

       </MenuItem>

   </Menu>

</MenuBar>


每个节点直接用一个String来表示该数据。


对于每一个Menu和其MenuItems用一个ArrayList来装,并且该ArrayList的索引为0的位置存放该Menu,剩下的按序存放其MenuItems。


同时因为Menu的个数也是不确定的,所以所有的Menu也用一个ArrayLisy来装。



下面讲讲具体的代码实现:


a.xml的装载



//用map来做每个节点的属性值记录

//用ArrayList来装每个Menu及其子节点

//用一个数组来装所有的ArrayList

private File file;

private SAXReader saxReader;

private ArrayList<String> node;

private ArrayList<ArrayList<String>> nodes;

public void read(String filePath)

{

file = new File(filePath);

saxReader = new SAXReader();//实例化

nodes = new ArrayList<ArrayList<String>>();

try {

Document document = saxReader.read(file);

Element root = document.getRootElement();

for(Iterator<Element> i = root.elementIterator(); i.hasNext(); )

{

node = new ArrayList<String>();

Element menu = i.next();

node.add(menu.attribute("name").getValue());

for(Iterator<Element> j = menu.elementIterator(); j.hasNext();)

{

Element menuItem = j.next();

node.add(menuItem.attribute("name").getValue());

}

nodes.add(node);

}

} catch (DocumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


所有的xml中的数据已按序存放在nodes中。


b.MenuItem的生成


for(ArrayList<String> node : nodes)

{

menu = new JMenu(node.get(0));

for(int i=1; i<node.size();i++)

{

System.out.println(node.get(i));

menuItem = new JMenuItem(node.get(i));

menu.add(menuItem);

}

jMenuBar.add(menu);

}



这样,其余的步骤就比较雷同了,本方法已经实现,如果你的实现有问题,可以再仔细思考下,祝你成功。