1


以下のコードで気に入らない点は次のとおりです。

  1. 各ページのすべての JButton に getter が必要です
  2. メソッドはactionPerformedif-else ステートメントですぐに肥大化する可能性があります

では、単一のクラスからすべての GUI アクションを制御するより良い方法はありますか? それぞれのページ内でメソッド

を定義する場合( )、各ページは切り替え先のページのインスタンスにアクセスする必要があり、各ページにパターンを 使用しないようにしています...actionPerformedJPanelSingleton


コードは次のとおりです。

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
4

2 に答える 2

2

を使用しCard Layoutます。カード レイアウト アクションは、役に立つと思われるいくつかの追加機能を追加します。

于 2013-05-21T04:01:58.197 に答える
1

カード レイアウトを使用することも、クリエイティブになって要素を削除することもできます。例えば:

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

もちろん、私は GUI に組み込まれた Java をまったく扱いません。IMO のレイアウト設計は恐ろしいものです。「A New Look and Feel」 -- http://www.javootoo.com/のようなものを使用したいと思います。

于 2013-05-21T05:11:15.713 に答える