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() 方法能够访问按钮变量,则该变量必须具有实例范围(或静态,几乎总是不太可取)。在您编写的方法中引用它是行不通的,因为该button变量是构造函数的本地变量。

评论中的建议是为每个按钮制作一个单独的 ActionListener;if (e.getSource() == button)如果一个 actionPerformed() 方法被多个按钮调用,您只需要使用。对于 SO 答案,这些之间的区别有点大;您可以在 Oracle 的 Java 教程中获得有关操作侦听器的教程。

您在上面开始的方式表明您将使用 OptionPanel 作为所有按钮的单个操作侦听器,因此它需要测试哪个按钮调用了它。相反,如果每个按钮都有一个单独的操作侦听器,那么它知道哪个按钮调用了它并且不需要测试。

尝试查找与 Java 中的动作侦听器相关的“匿名内部类”。

于 2013-05-19T00:14:08.877 回答