0

現在、ゲームの基本的なゲーム メニューを作成しようとしています。今のところ、メニューをテストしているところです。私が書いたオプションのほとんどは、メニューが実際に機能するかどうかをテストするためのものです。したがって、Menu クラスと OptionPanel クラスもあります。

メニュークラスは次のとおりです。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class Main extends JFrame  {

JPanel cardPanel;

public Main(String title) {
    super(title);
    setBounds(100, 100, 800, 600);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    cardPanel = new JPanel();
    CardLayout cl = new CardLayout();
    cardPanel.setLayout(cl);


    OptionPanel panel1 = new OptionPanel(this);
    Board panel2 = new Board();
    Rules panel3 = new Rules();



    cardPanel.add(panel1,"1");
    cardPanel.add(panel2,"2");
    cardPanel.add(panel3,"3");

    add(cardPanel);

    setVisible(true);
}

public static void main(String[] args)
{
    Main w = new Main("AP Animation Demo");
}

public void changePanel() {
    ((CardLayout)cardPanel.getLayout()).next(cardPanel);
    requestFocus();
}

}

そして、これが私のオプションパネルクラスです:

  import java.awt.*;
  import javax.swing.*;
  import java.awt.event.*;


 public class OptionPanel extends JPanel implements ActionListener {

Main w;

public OptionPanel(Main w) {
    this.w = w;
    JButton button = new JButton("Press me!");
    button.addActionListener(this);
    add(button);
    JButton button2 = new JButton("Game rules");
    button2.addActionListener(this);
    add(button2);
}

public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    setBackground(Color.BLACK);
    }// Call JPanel's paintComponent method to paint the background

public void actionPerformed(ActionEvent e) {

    w.changePanel();
}

}

メニューがポップアップしたときに、ゲームにつながるボタンをクリックし、別のボタンをクリックすると別の画面にリンクできるようにするにはどうすればよいですか。actionPerformed と関係があると思うので、if (e.getSource == button) などを追加してみましたが、ボタン変数が見つかりませんでした。アドバイス/フィードバックはありますか?

4

1 に答える 1

1

actionPerformed() メソッドでボタン変数にアクセスできるようにするには、変数にインスタンス スコープ (または static、あまり好ましくない) が必要です。button変数はコンストラクターに対してローカルであるため、記述したとおりにメソッドで参照しても機能しません。

コメントの提案は、ボタンごとに個別の ActionListener を作成することです。if (e.getSource() == button)1 つの actionPerformed() メソッドが複数のボタンに対して呼び出される場合にのみ、 を使用する必要があります。これらの違いは、SOの回答には少し大きいです。Oracle の Java チュートリアルで、アクション リスナーに関するチュートリアルを入手できます。

上記で開始した方法は、OptionPanel をすべてのボタンの単一のアクション リスナーとして使用することを示唆しているため、どのボタンがそれを呼び出したかをテストする必要があります。代わりに、ボタンごとに個別のアクション リスナーがある場合は、どのボタンがそれを呼び出したかを認識し、テストする必要はありません。

Java のアクション リスナーに関連する「匿名内部クラス」を検索してみてください。

于 2013-05-19T00:14:08.877 に答える