菜单栏(JMenuBar)包含多个根菜单(JMenu),每个根菜单下可以有零到多个菜单项(JMenuItem)。
- 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);
- ...
- }
- }
- /**
- * 用于描述根菜单工厂的接口
- *
- * @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一下先。
最后上今天的效果图,新建菜单项出来了。