关于创建游戏菜单我搞砸了哪里?

时间:2013-05-18 22:49:25

标签: java swing jbutton actionlistener

我正在尝试为游戏创建一个基本的游戏菜单。我现在只是测试菜单,我写的大部分选项只是测试菜单是否真的有效。所以我有一个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();
}

}

这是我的Option Panel类:

  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)和类似的东西,但它找不到任何按钮变量。有什么建议/反馈吗?

1 个答案:

答案 0 :(得分:1)

如果您希望actionPerformed()方法能够访问按钮变量,那么变量必须具有实例范围(或静态,几乎总是不太优选)。在您编写的方法中引用它将不起作用,因为button变量是构造函数的本地变量。

评论中的建议是为每个按钮创建一个单独的ActionListener;如果为多个按钮调用一个actionPerformed()方法,则只需要使用if (e.getSource() == button)。这些差异对于SO答案来说有点多了;您可以在Oracle的Java教程中获得有关动作侦听器的教程。

上面的方法表明你将使用OptionPanel作为所有按钮的单个动作监听器,因此它需要测试调用它的按钮。相反,如果每个按钮都有一个单独的动作侦听器,那么它就知道哪个按钮调用了它而不需要测试。

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