什么是在GUI页面之间切换的可取设计模式?

时间:2013-05-21 03:59:09

标签: java swing design-patterns user-interface actionlistener


我不喜欢下面的代码是:

    每页每个JButton都需要
  1. getter
  2. 使用if-else语句快速使actionPerformed方法变得臃肿
  3. 那么,有没有更好的方法来控制单个类的所有GUI操作?

    如果我在每个相应的页面(actionPerformed)中定义JPanel方法,则每个页面都需要访问切换到的页面的实例,并且我正在尝试避免为每个页面使用Singleton模式...

    <小时/> 这是代码:

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    /**
     * 
     * @author Ian A. Campbell
     *
     */
    public class Controller implements ActionListener {
    
        /**
         * instance variables:
         */
        private Frame frame;
        private OptionPage firstPage;
        private FirstOptionPage firstOption;
        private SecondOptionPage secondOption;
    
        /**
         * 
         */
        public Controller() {
    
            // instantiating the frame here:
            this.frame = new Frame();
    
            /*
             *  instantiating all pages here:
             *  
             *  NOTE: passing "this" because this class
             *  handles the events from these pages
             */
            this.firstPage = new OptionPage(this);
            this.firstOption = new FirstOptionPage(this);
            this.secondOption = new SecondOptionPage(this);
        }
    
        /**
         * 
         */
        public void start() {
            this.frame.add(this.firstPage); // adding the first page
    
            // NOTE: these lines prevent blank loading and flickering pages!
            this.frame.validate();
            this.frame.repaint();
            this.frame.setVisible(true);
        }
    
        /**
         * 
         * @return the JFrame instantiated from the class Frame
         */
        public Frame getFrame() {
            return this.frame;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
    
            // the "first option" button from the OptionPage:
            if (e.getSource() == this.firstPage.getFirstButton()) {
                this.frame.getContentPane().removeAll();
                this.frame.getContentPane().add(this.firstOption);
    
            // the "second option" button from the OptionPage:
            } else if (e.getSource() == this.firstPage.getSecondButton()) {
                this.frame.getContentPane().removeAll();
                this.frame.getContentPane().add(this.secondOption);
            }
    
            // NOTE: these lines prevent blank loading and flickering pages!
            this.frame.validate();
            this.frame.repaint();
            this.frame.setVisible(true);
        }
    } // end of Controller
    

2 个答案:

答案 0 :(得分:2)

使用Card LayoutCard Layout Actions添加了一些您可能会发现有用的额外功能。

答案 1 :(得分:1)

您可以使用卡片布局,也可以获得创意并删除元素。例如:

panel.remove((JButton)myButton1)); // Remove all of the elements...
panel.add((JButton)myButton2)); // Add the new elements

当然我根本不会处理内置GUI的java,IMO的布局设计很可怕。我宁愿使用像“新面貌”这样的东西 - http://www.javootoo.com/