平常在做菜单的时候,都是先生成菜单条,然后根据需要生成菜单,在每个菜单中再根据需要来添加需要的菜单项,这个过程很明了,但是有一点不好,就是代码看起来要比较混乱和繁杂。
而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);
}
这样,其余的步骤就比较雷同了,本方法已经实现,如果你的实现有问题,可以再仔细思考下,祝你成功。