⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menuloader.java

📁 Athena酒店小组_Athena酒店管理系统
💻 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 + -