📄 menuloader.java
字号:
/*
* MenuLoader.java
* Copyright (C) 2007 Athena project team
*/
package utils;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import plugin.*;
/**
* 菜单读取类 - 用于从XML文件中加载指定的模块
* @author Vincent
* @version 1.0
*/
public class MenuLoader
{
public static final String CONFIG_MENU_FILE = "Module.Menubar.xml";
public static final String NODE_MENU = "menu";
public static final String NODE_MENUITEM = "menuitem";
public static final String MENU_NAME = "name";
public static final String MENU_PACKAGE = "package";
public static final String MENU_CLASS = "class";
public static final String MENU_MNEMONIC = "mnemonic";
private JMenuBar menuBar;
private IGUIResource guiRes;
private IDBResource dbRes;
private Hashtable<Object, IAppPlugin> map = new Hashtable<Object, IAppPlugin>();
/**
* 构造函数
* @param guiRes 用户界面资源接口
* @param dbRes 数据库资源接口
* @param purview 权限接口
*/
public MenuLoader(IGUIResource guiRes, IDBResource dbRes)
{
this.guiRes = guiRes;
this.dbRes = dbRes;
//获取菜单栏
this.menuBar = guiRes.getMenusBar();
}
/**
* 将默认Xml文件中所配置的菜单树添加到菜单栏上
* @param xmlFileName Xml文件
*/
public void addMenuWithDefaultXml()
{
buildMenus(MenuLoader.CONFIG_MENU_FILE);
}
/**
* 将Xml文件中所配置的菜单树添加到菜单栏上
* @param xmlFileName Xml文件
*/
public void addMenuWithXml(String xmlFileName)
{
buildMenus(xmlFileName);
}
/**
* 根据Xml文件名建立菜单
* @param xmlFileName Xml文件名
*/
private void buildMenus(String xmlFileName)
{
try
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(xmlFileName);
Element root = doc.getDocumentElement();
//迭代函数,用来生成菜单树
iterateMenu(null, root);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
/**
* 用来生成菜单树的迭代函数
* @param menu 菜单
* @param node 节点
*/
private void iterateMenu(JMenu menu, Node node)
{
//获取子节点
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++)
{
Node tempNode = list.item(i);
if (tempNode.getNodeType()==Node.ELEMENT_NODE)
{
//判断节点是否为菜单
if (tempNode.getNodeName().equals(MenuLoader.NODE_MENU))
{
JMenu tempMenu = new JMenu();
//装配菜单并将其添加到菜单栏或菜单
if (assembleMenu(tempMenu, tempNode))
{
if (menu == null)
{
menuBar.add(tempMenu);
}
else
{
menu.add(tempMenu);
}
//迭代
iterateMenu(tempMenu, tempNode);
}
}
//判断节点是否为菜单项
else if (tempNode.getNodeName().equals(MenuLoader.NODE_MENUITEM))
{
JMenuItem tempItem = new JMenuItem();
//装配菜单项并将其添加到菜单
if (assembleMenuItem(tempItem, tempNode))
{
menu.add(tempItem);
}
}
}
}
}
/**
* 使用菜单节点装配菜单
* @param menu 待装配的菜单
* @param node 菜单节点
* @return 是否装配成功
*/
private boolean assembleMenu(JMenu menu, Node node)
{
try
{
//获取菜单属性
String menuName = node.getAttributes().getNamedItem("name").getNodeValue();
String mnemonic = null;
if (node.getAttributes().getNamedItem(MenuLoader.MENU_MNEMONIC) != null)
{
mnemonic = node.getAttributes().getNamedItem(MenuLoader.MENU_MNEMONIC).getNodeValue();
}
//设置菜单属性
menu.setText(menuName);
if (mnemonic != null)
{
menu.setMnemonic(mnemonic.charAt(0));
}
menu.setFont(new Font("新宋体", Font.PLAIN,12));
return true;
}
catch(Exception ex)
{
ex.printStackTrace();
return false;
}
}
/**
* 使用菜单项节点装配菜单项
* @param menu 待装配的菜单项
* @param node 菜单项节点
* @return 是否装配成功
*/
private boolean assembleMenuItem(JMenuItem item, Node node)
{
try
{
//获取菜单项属性
String menuName = node.getAttributes().getNamedItem(MenuLoader.MENU_NAME).getNodeValue();
String packageFile = node.getAttributes().getNamedItem(MenuLoader.MENU_PACKAGE).getNodeValue();
String className = node.getAttributes().getNamedItem(MenuLoader.MENU_CLASS).getNodeValue();
String mnemonic = null;
if (node.getAttributes().getNamedItem(MenuLoader.MENU_MNEMONIC) != null)
{
mnemonic = node.getAttributes().getNamedItem(MenuLoader.MENU_MNEMONIC).getNodeValue();
}
//设置菜单项属性
item.setText(menuName);
if (mnemonic != null)
{
item.setMnemonic(mnemonic.charAt(0));
}
item.setFont(new Font("新宋体", Font.PLAIN,12));
//读取插件
if(!loadPlugin(item, packageFile, className))
{
return false;
}
//为菜单项添加事件
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
IAppPlugin appPlugin = map.get(event.getSource());
appPlugin.runApp();
}
});
return true;
}
catch(Exception ex)
{
ex.printStackTrace();
return false;
}
}
/**
* 读取插件
* @param packageFile 插件所在的jar文件
* @param className 插件的完整类名
* @return 是否读取成功
*/
private boolean loadPlugin(JMenuItem item, String packageFile, String className)
{
try
{
//利用反射装载插件类
URL[] urls = new URL[1];
urls[0] = (new File(packageFile)).toURI().toURL();
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass(className);
//将反射出的Object对象转化为IPlugin
Object obj = cls.newInstance();
IAppPlugin appPlugin = (IAppPlugin)obj;
//为插件装载资源
appPlugin.loadResource(guiRes, dbRes);
//插件初始化
appPlugin.initPlugin();
//设置插件所在的菜单项
appPlugin.setMenuItem(item);
//加入Hashtable
map.put(item, appPlugin);
return true;
}
catch(Exception ex)
{
ex.printStackTrace();
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -