如何根据XML动态创建MenuBar中的Menu?

wanchengpeng 2006-08-07 04:49:03
应该如何定义和解析XML?我初步想了一下,用如下的方式来定义菜单,其中name为显示的名字,class为菜单的事件监听程序的类名,description为注释。
<?xml version="1.0" encoding="UTF-8"?>
<menubar>
<menu name="文件" class="" discription="" icon="">
<submenu name="新建" class="" discription=""></submenu>
<submenu name="关闭" class="" discription=""></submenu>
<separator></separator>
<submenu name="保存" class="" discription=""></submenu>
<submenu name="另存为" class="" discription=""></submenu>
<separator></separator>
<submenu name="退出" class="" discription=""></submenu>
</menu>
</menubar>
我现在有几个问题:
1:这样做可不可行?
2:定义的XML格式是否合理?
3:如何定义相关的DTD?
4:如何解析这个XML?
5:谁能够给一个DEMO(呵呵,想偷懒)
欢迎大家讨论~~~
...全文
412 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanchengpeng 2006-08-09
  • 打赏
  • 举报
回复
自己顶一下
wanchengpeng 2006-08-09
  • 打赏
  • 举报
回复
隐约觉得Eclipse用的好像也是这样的做法,查了一下,果真如此:
View Menus,Toolbars and Actions

Identifier: org.eclipse.ui.viewActions


Description: This extension point is used to add actions to the pulldown menu and toolbar for views registered by other plug-ins. Each view has a local pulldown menu normally activated by clicking on the top right triangle button. Other plug-ins can contribute submenus and actions to this menu. Plug-ins may also contribute actions to a view toolbar. View owners are first given a chance to populate these areas. Optional additions by other plug-ins are appended.

An action's enablement and/or visibility can be defined using the elements enablement and visibility respectively. These two elements contain a boolean expression that is evaluated to determine the enablement and/or visibility.

The syntax is the same for the enablement and visibility elements. Both contain only one boolean expression sub-element. In the simplest case, this will be an objectClass, objectState, pluginState, or systemProperty element. In the more complex case, the and, or, and not elements can be combined to form a boolean expression. Both the and, and or elements must contain 2 sub-elements. The not element must contain only 1 sub-element.

ufoBizSoft 2006-08-08
  • 打赏
  • 举报
回复
想法还是好的,其实一般的管理系统里很多东西都可以用这种模板机制, 包括一些数据库操作, 但menu的问题是很难实现完全的xml配置, 因为事件响应还要写很多代码.


lz的代码比较乱.
hackangcn 2006-08-08
  • 打赏
  • 举报
回复
用dom4j,xml解析完成后放到hashmap中
wanchengpeng 2006-08-08
  • 打赏
  • 举报
回复
这就像一个框架一样,我只要指定菜单项和相应的ActionListener,这个菜单就会自动应用到程序中,是不是有点像适配器模式?只要拿来插上就可以用,欢迎讨论继续~~
wanchengpeng 2006-08-08
  • 打赏
  • 举报
回复
这是解析XML的代码:非常乱,不知道有没有人能够帮忙优化优化,我 水平太滥了,希望大家多多指点~~
private JMenuBar createMenuBar()
{
JMenuBar menuBar = new JMenuBar();
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("configs\\MenuBar.xml");
Element root = doc.getDocumentElement();
NodeList items = root.getElementsByTagName("menu");
for(int i = 0; i < items.getLength(); i ++)
{
Node item = (Node)items.item(i);
JMenu menu = new JMenu(item.getAttributes().getNamedItem("name").getTextContent());
NodeList submenus = item.getChildNodes();
for(int j = 0; j < submenus.getLength(); j ++)
{
Node submenu = (Node)submenus.item(j);
if(submenu instanceof Element){
if(submenu.getNodeName().trim().toUpperCase().equals("SEPARATOR"))
{
menu.addSeparator();
}
else
{
JMenuItem menuItem = new JMenuItem(submenu.getAttributes().getNamedItem("name").getTextContent());
menuItem.addActionListener((ActionListener)Class.forName(submenu.getAttributes().getNamedItem("action").getTextContent()).newInstance());
menu.add(menuItem);
}
}
}
menuBar.add(menu);
}
}catch (Exception e)
{
JOptionPane.showMessageDialog(this, e);
}
return menuBar;
}
wanchengpeng 2006-08-08
  • 打赏
  • 举报
回复
我是一个菜鸟,我这样做的目的是:如果系统的菜单需要更改时,把对系统代码的改动减少到最低~我试了一下,好像成功了,欢迎大家继续讨论
<?xml version="1.0" encoding="UTF-8"?>
<menubar>
<menu name="文件">
<submenu name="新建" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="新建文件" icon="images/newfile.ico"></submenu>
<submenu name="打开" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<submenu name="关闭" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<separator></separator>
<submenu name="保存" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<submenu name="另存为" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<separator></separator>
<submenu name="退出" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
</menu>
<menu name="编辑">
<submenu name="撤销" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<submenu name="重做" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<separator></separator>
<submenu name="剪切" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<submenu name="复制" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<submenu name="粘贴" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
<submenu name="删除" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
</menu>
</menubar>
lcllcl987 2006-08-08
  • 打赏
  • 举报
回复
已经有成熟的东西了,lz不必自己从头搞
你看看xul或许对你有帮助,我看到过支持xul的swing程序,当然xul对web也支持
zhmt 2006-08-08
  • 打赏
  • 举报
回复
up!..............mark!
  • 打赏
  • 举报
回复
可以用swixml
ghosert 2006-08-08
  • 打赏
  • 举报
回复
DOM4J解析最好,如果客户端里没有要求修改菜单的需求,即一旦程序启动后,不会要求增删菜单,那可以省略DTD,DTD的作用再于定义和约束XML的格式,也是修改XML的依据,实际操作时如果你的需求一旦涉及增删菜单,那你既要定义DTD,又要根据DTD操作XML,代码会相当麻烦,最好还是不要这样做。如果只是对XML做读取工作,那是可行的。
但我不知道你这个代码是用于SWING还是SWT,据我所知,关于菜单部分的JAVA GUI的标准做法都不是由程序员自定义XML的。
cyeahpro 2006-08-08
  • 打赏
  • 举报
回复
d
hbwhwang 2006-08-08
  • 打赏
  • 举报
回复
你怎么样做有什么好处呢?
每个菜单要有一个监听器,你还不是得用代码
wanchengpeng 2006-08-08
  • 打赏
  • 举报
回复
起码我想到了这个东西可以这样做,只是没有多少经验,有些地方有些困惑,这样不算偷懒吧~~~回头想一下,谁学习java不是照着个把例子一点一点摸索的?
hbwhwang 2006-08-08
  • 打赏
  • 举报
回复
鄙视这种偷懒的行为~
wanchengpeng 2006-08-08
  • 打赏
  • 举报
回复
还有人继续讨论这个问题吗?等待ing~~~~
Squall1009 2006-08-07
  • 打赏
  • 举报
回复
建议直接实现Action接口,这样的话比较方便
Squall1009 2006-08-07
  • 打赏
  • 举报
回复
1、可行
2、可以再添加一些其他的属性进去
3、自己去看xml的书,好象.xsd比较好
4、dom4j,jdom
5、自己写比较好
  • 打赏
  • 举报
回复
关注,帮你顶

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧