1

メニューバーを作成するために、複合パターンを実験しようとしています。
コードは次のとおりです。

    public class TestMenu {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        MenuComponent openMenu = new MyMenu("Open Menu");
        MenuComponent openMenuItem1 = new MyMenuItem("Open Menu Item 1");
        MenuComponent openMenuItem2 = new MyMenuItem("Open Menu Item 2");
        openMenu.addMenu(openMenuItem1);
        openMenu.addMenu(openMenuItem2);
        MenuComponent exitMenuItem = new MyMenuItem("Exit Menu");

        MenuComponent mainMenu = new MyMenu("Main");
        mainMenu.addMenu(openMenu);
        mainMenu.addMenu(exitMenuItem);

        TestMenuFrame frame = new TestMenuFrame();
        frame.getMyMenuBar().addMainMenu(mainMenu);
        frame.setVisible(true);
    }
}


   public class MenuBar extends JComponent {

    public MenuBar() {
        setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));

    }

    void addMainMenu(MenuComponent mainMenu) {
        JButton btn = new JButton(mainMenu.getName());
        final JPopupMenu popupMenu = new JPopupMenu();
        Iterator<MenuComponent> iterator = mainMenu.iterator();
        if (iterator != null) {
            while (iterator.hasNext()) {
                MenuComponent menuComponent = iterator.next();
                JMenuItem item = new JMenuItem(menuComponent.getName());
                popupMenu.add(item);
            }
        }
        btn.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                JButton btn = (JButton) e.getSource();
                popupMenu.show(e.getComponent(), e.getX(), e.getY());
            }
        });
        add(btn);
    }
}


    public abstract class MenuComponent {

    protected String name;

    public MenuComponent(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public abstract void addMenu(MenuComponent menu);

    public abstract Iterator<MenuComponent> iterator();

}


   public class MyMenu extends MenuComponent {

    private List<MenuComponent> listMenu = new ArrayList<>();

    public MyMenu(String name) {
        super(name);
    }

    @Override
    public void addMenu(MenuComponent menu) {
        listMenu.add(menu);
    }

    @Override
    public Iterator<MenuComponent> iterator() {
        return listMenu.iterator();
    }
}


    public class MyMenuItem extends MenuComponent {

    public MyMenuItem(String name) {
        super(name);
    }

    @Override
    public void addMenu(MenuComponent menu) {
//        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Iterator<MenuComponent> iterator() {
//        throw new UnsupportedOperationException("Not supported yet.");
        return null;
    }
}


問題は、アプリケーションを起動したときにサブ メニューが表示されないことです。このテスト例では、[開く] メニューと [終了] メニューしか表示されません。使用できる複合パターンのバリエーションはありますか?

4

2 に答える 2

1

もちろん、サブメニューは表示されません。次のループ

while (iterator.hasNext()) {
  MenuComponent menuComponent = iterator.next();
  JMenuItem item = new JMenuItem(menuComponent.getName());
  popupMenu.add(item);
}

1 レベルの深さしかありません。menuComponent変数が空でないシナリオも考慮しませんIterator

于 2012-10-17T19:45:11.327 に答える
0

私は2つの別々の方法を使用して動作させましたが、誰かがより良い方法を持っている場合は常にそれを取ります.
たとえば、両方のメソッドがほぼ同じことを行うため、1 つのメソッドを使用するだけです。

          public class MenuBar extends JComponent {

            public MenuBar() {
                setLayout(new FlowLayout(FlowLayout.LEFT, 2, 2));

            }

            void addMainMenu(MenuComponent mainMenu) {
                JButton btn = new JButton(mainMenu.getName());
                final JPopupMenu popupMenu = new JPopupMenu();
                addPopupMenus(mainMenu);
                btn.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        JButton btn = (JButton) e.getSource();
                        popupMenu.show(e.getComponent(), e.getX(), e.getY());
                    }
                });
                add(btn);
            }

    private void addPopupMenus(final MenuComponent menu) {
                final Iterator<MenuComponent> iterator = menu.iterator();
                JMenuItem main;
                while (iterator.hasNext()) {
                    final MenuComponent abstractMenu = iterator.next();
                    if (abstractMenu.iterator().hasNext()) {
                        main = new JMenu(abstractMenu.getMenuName());
                    } else {
                        main = new JMenuItem(abstractMenu.getMenuName());
                    }
                    addPopupMenus(abstractMenu, main);
                    popupMenu.add(main);
                }
            }

            private void addPopupMenus(MenuComponent menu, JMenuItem jMenuItem) {
                final Iterator<MenuComponent> iterator = menu.iterator();
                JMenuItem main;
                while (iterator.hasNext()) {
                    final MenuComponent abstractMenu = iterator.next();
                    if (abstractMenu.iterator().hasNext()) {
                        main = new JMenu(abstractMenu.getMenuName());
                        addPopupMenus(abstractMenu, main);
                    } else {
                        main = new JMenuItem(abstractMenu.getMenuName());
                    }
                    jMenuItem.add(main);
                }
            }
        }

    }
}
于 2012-10-18T11:38:28.270 に答える