我正在尝试为游戏创建一个基本的游戏菜单。我现在只是测试菜单,我写的大部分选项只是测试菜单是否真的有效。所以我有一个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)和类似的东西,但它找不到任何按钮变量。有什么建议/反馈吗?
答案 0 :(得分:1)
如果您希望actionPerformed()方法能够访问按钮变量,那么变量必须具有实例范围(或静态,几乎总是不太优选)。在您编写的方法中引用它将不起作用,因为button
变量是构造函数的本地变量。
评论中的建议是为每个按钮创建一个单独的ActionListener;如果为多个按钮调用一个actionPerformed()方法,则只需要使用if (e.getSource() == button)
。这些差异对于SO答案来说有点多了;您可以在Oracle的Java教程中获得有关动作侦听器的教程。
上面的方法表明你将使用OptionPanel作为所有按钮的单个动作监听器,因此它需要测试调用它的按钮。相反,如果每个按钮都有一个单独的动作侦听器,那么它就知道哪个按钮调用了它而不需要测试。
尝试查找“匿名内部类”,因为它们与Java中的动作侦听器相关。