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

标签 java swing design-patterns user-interface actionlistener


我不喜欢下面的代码的地方是:

  1. 每个页面上的每个 JButton 都需要 getter
  2. actionPerformed 方法很快就会因 if-else 语句而变得臃肿

那么,是否有更好的方法从一个类控制所有 GUI 操作?

如果我在每个相应的页面 (JPanel) 中定义一个 actionPerformed 方法,每个页面都需要访问切换到的页面的实例,我正在尝试 < strong>避免为每个页面使用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

最佳答案

使用卡片布局Card Layout Actions添加了一些您可能会觉得有用的额外功能。

关于java - 在 GUI 页面之间切换的可取设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661882/

相关文章:

java - 更改 DOM4J 文档 : UTF to ISO-8859-1 (Java) 的编码

java - 类之间的关系

java - Swing 中的多点触控

javascript - 指令之间通信的最佳方式

java - 如何实现 CRUD 操作的命令模式

java - 扫描阿拉伯字符 netbeans 8

java - Postgres : Passing custom types from Java to postgres function

java - 空字符串的 JDK 常量

java - 如何在JPanel中设置左对齐JLabel

python - 将 n 个 DataFrame 按元素聚合为单个 DataFrame