菜单栏(JMenuBar)包含多个根菜单(JMenu),每个根菜单下可以有零到多个菜单项(JMenuItem)。
结构图如下:
********************************************************
* ---- JMenu -------- JMenu --------JMenu *
* | | | *
* |-JMenuItem |-JMenuItem |-JMenuItem *
* | *
* |-JMenuItem *
* | | *
* | |-JMenuItem *
* | *
* |-JMenuItem *
********************** JMenuBar ***********************
每个菜单项都对应着一项或多项功能,要生成这么多菜单项,完成的功能也很复杂。如果管理好这么多功能,控制好程序结构,就需要工厂方法来帮忙了。工厂方法的提出目的之一,是为了简化客户端的代码复杂度。试想这么多的菜单项,要一个一个new,实在是一件痛苦的事情。脱离苦海的方法之一,便是封装。将实现细节隐藏在工厂车间里,生产出来的产品直接使用便是。
这里将每个根菜单视作产品的话,则只需在客户端程序中调用工厂方法生产几个根菜单即可。大致UML关系如下:
客户端代码只需对MEditor.java稍作修改,如下:
- public class MEditor {
- ...
- ...
- /**
- * 编辑器菜单栏
- */
- private EditorMenu fileMenu;
- public void createWindow() {
- ...
- // 利用工厂方法创建根菜单
- MenuFactory fileMenuFactory = new FileMenuFactory();
- fileMenu = fileMenuFactory.getMenuInstance();
- // 将根菜单放入菜单栏中,
- JMenuBar menuBar = new JMenuBar();
- menuBar.add((JMenu) fileMenu);
- frame.setJMenuBar(menuBar);
- ...
- }
- }
生产根菜单的抽象工厂(MenuFactory.java)代码如下:
- /**
- * 用于描述根菜单工厂的接口
- *
- * @author mitume
- * @version MEditor v1.0
- */
- public interface MenuFactory {
- /**
- * 取得根菜单实例
- */
- public EditorMenu getMenuInstance();
- }
生产根菜单的具体工厂(FileMenuFactory.java)代码如下:
- /**
- * File根菜单的具体生产工厂
- *
- * @author mitume
- * @version MEditor v1.0
- */
- public class FileMenuFactory implements MenuFactory {
- /**
- * 取得文件根菜单的实例
- */
- @Override
- public FileMenu getMenuInstance() {
- return FileMenu.getInstance();
- }
- }
抽象的工厂产品(EditorMenu.java)代码如下:
- /**
- * 用于描述编辑器根菜单的接口
- *
- * @author mitume
- * @version MEditor v1.0
- */
- public interface EditorMenu{
- // 待添加以描述行为
- }
具体的工厂产品(FileMenu.java)代码如下:
- /**
- * 根菜单类(File)
- *
- * @author mitume
- * @version MEditor v1.0
- */
- public class FileMenu extends JMenu implements EditorMenu{
- /*
- * 取得FileMenu的唯一实例
- */
- static public FileMenu getInstance() {
- if (fileMenu != null) {
- return fileMenu;
- }
- else {
- genEditorMenu();
- return fileMenu;
- }
- }
- /*
- * 创建菜单
- */
- static private void genEditorMenu() {
- // 创建自身实例
- fileMenu = new FileMenu("File");
- fileMenu.setMnemonic('F');
- // 加入新建菜单项
- menuFileNew = new JMenuItem("New", 'N');
- fileMenu.add(menuFileNew);
- }
- /**
- * FileMenu类的唯一实例
- */
- static private FileMenu fileMenu;
- /**
- * 菜单项<新建>
- */
- static private JMenuItem menuFileNew = null;
- /**
- * 构造方法(私有)
- * @param menuName
- */
- private FileMenu(String menuName) {
- super(menuName);
- }
- }
这里的FileMenu写的很不好看,尤其是菜单项的添加,显得笨拙。先写到这里吧,以后想起再修改。
设想中,以后为用户提供一个根菜单。用户可以对其下进行编辑,生成自己的菜单项。或是将整个根菜单做成插件,动态添加。
纯属遐想,还不知道如何实现。Mark一下先。
最后上今天的效果图,新建菜单项出来了。
转载于:https://blog.51cto.com/mitume/617201