-1

したがって、 a を拡張するクラスがJPanelあり、コンストラクター内に myJButtonsと、追加する必要があるものを追加します。MainFrameコンテナ ( ) であるクラスもありJFrame、このクラスはFrameSwitcher(Controller) というクラスから引数を取り、どのボタンがクリックされたかを評価し、その情報をMainFrame

これを行うのに問題があります。これを行う適切な方法が見つかりません。また、JButtons をプライベートで非静的に維持したいと考えています。

JPanel の例:

public class MainMenu() {

    private JButton btnSinglePlayer, btnMultiPlayer;

    public MainMenu() {
        setLayout(null);

        btnSinglePlayer = new JButton("singlePlayer");
        btnSinglePlayer.setBounds(320, 25, 275, 130);
        add(btnSinglePlayer);

        btnMultiPlayer = new JButton("MultiPlayer");
        btnMultiPlayer.setBounds(320, 170 , 275, 130);
        add(btnMultiPlayer);

   }
}

フレームスイッチャー:

public class FrameSwitcher implements panelListener { // panelListener is an interface defined else where.

    public FrameSwitcher(MainFrame frame) {
        // This is irrelevant to the question. 
    } 

    @Override
    public void gamePanel() {
        System.out.println("GamePanel Event: Recieved");
    }
    @Override
    public void mainMenu() {
        System.out.println("mainMenu Event: Recieved");
    }
    @Override
    public void scoreBoardPanel() {
        System.out.println("scoreBoardPanel Event: Recieved");
    }
}

次に、私のメインフレーム:

public class MainFrame extends JFrame implements ActionListener {

    private PanelListener panelListener;
    private JFrame mainContainer = new JFrame("Game");
    private JPanel mainMenu = new MainMenu();

    public void start() {
         mainContainer(mainMenu);
    }

    public MainFrame(JPanel frame) {
        mainContainer.getContentPane().add(frame);
        mainContainer.pack();
        // Other methods to initialize the frame
        return mainContainer;
     }

    public void switchFrames(PanelListener panelListener) {
        this.panelListener = panelListener; // PanelListener is an interface.
    }

    public void actionPerformed(ActionEvent e) {

        JButton source = (JButton)e.getsource();

        if(source == MainMenu.btnSinglePlayer) {
            if(panelListener != null) {
                System.out.println("Recieved the event approriately.");
            }
        }
    }
}

この例では、コンパイルはしますが、本来の動作はしません。もう 1 つのことは、現在 JButton を public および static として持っていることです。それは望ましくありません。

4

2 に答える 2

2

MainMenuクラスでは、関係者が登録できるある種のリスナーを追加する必要があります。これにより、何らかのイベントが発生したときに、関係者に通知することができます。

最も簡単な解決策は、addActionListener各ボタンに委任するメソッドを提供することです。ただし、これにより、公開していないアプリケーションの一部が公開される可能性があります(リスナーは、に直接アクセスできるようになり、JButtonあらゆる種類の厄介なことを実行できるようになりました)。

より良い解決策は、次のようなMainMenuListenerメソッドを持つのようなものstartSinglePlayerを作成することです。startMultiPlayer

add/removeMainMenuListener次に、クラス内にメソッドを提供しますMainMenu

次に、各ボタンが独自に登録されactionListener、適切なメニューリスナーイベントが発生します。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class MainMenu extends JPanel {

    private JButton btnSinglePlayer, btnMultiPlayer;

    public MainMenu() {
        setLayout(null);

        btnSinglePlayer = new JButton("singlePlayer");
        btnSinglePlayer.setBounds(320, 25, 275, 130);
        add(btnSinglePlayer);
        btnSinglePlayer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fireStartSinglePlayer();
            }
        });

        btnMultiPlayer = new JButton("MultiPlayer");
        btnMultiPlayer.setBounds(320, 170, 275, 130);
        add(btnMultiPlayer);
        btnMultiPlayer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fireStartMultiPlayer();
            }
        });

    }

    public void addMainMenuListener(MainMenuListener listener) {
        listenerList.add(MainMenuListener.class, listener);
    }

    public void removeMainMenuListener(MainMenuListener listener) {
        listenerList.remove(MainMenuListener.class, listener);
    }

    public void fireStartSinglePlayer() {
        MainMenuListener[] listeners = listenerList.getListeners(MainMenuListener.class);
        if (listeners != null && listeners.length > 0) {
            for (MainMenuListener listener : listeners) {
                listener.startSinglePlayer();
            }
        }
    }

    public void fireStartMultiPlayer() {
        MainMenuListener[] listeners = listenerList.getListeners(MainMenuListener.class);
        if (listeners != null && listeners.length > 0) {
            for (MainMenuListener listener : listeners) {
                listener.startMultiPlayer();
            }
        }
    }

    public interface MainMenuListener extends EventListener {

        public void startSinglePlayer();
        public void startMultiPlayer();

    }

}
于 2013-03-19T23:09:05.047 に答える
0

まず、このような ActionListener を作成する必要があります

class MyActionListener implements ActionListener{
    public void actionPerformed(ActionEvent ae){
        //do your stuff
    }
}

それから電話して、

yourButton.addActionListener(new MyActionListener());
于 2013-03-19T20:44:35.310 に答える