扫雷对象GUI

时间:2016-06-22 12:30:32

标签: java swing object minesweeper

我正在尝试使用JFrame做一个简单的扫雷游戏,但是我遇到了创建对象的麻烦。我创建了96个按钮,其中一些是错误的(“F”)和右(“R”):

public class GUIBase extends JFrame {

private JButton button;
private JButton fButton;


public GUIBase() {
    super("Minesweeper");
    setLayout(new FlowLayout());

    //Fields
    int position;
    for (int i = 0; i < 96; i++) {
        position = (int) (Math.random() * 100);
        if (position < 80) {
            button = new JButton("R");
            button.setToolTipText("Is this the correct one?");
            add(button);
        } else {
            fButton = new JButton("F");
            fButton.setToolTipText("Is this the correct one?");
            add(fButton);
        }           
    }

然后我使用ActionListener来检查按钮是否正确。如果按钮正确,它将获得.setEnabled(false),否则游戏结束:

    //Action
    Action action = new Action();
    button.addActionListener(action);
    fButton.addActionListener(action);

}

private class Action implements ActionListener {

    public void actionPerformed(ActionEvent event) {
        System.out.println("Somethin");

        if (event.getSource() == button) {
            button.setEnabled(false);
        } else if (event.getSource() == fButton) {
            JOptionPane.showMessageDialog(null, "You lost!");
            System.exit(0);
        } else {
            JOptionPane.showMessageDialog(null, "An error ocurred");
            System.exit(0);
        }           
    }
} 

游戏中的所有内容都按计划进行,但只有最后一个正确的按钮(“R”)和最后一个错误的按钮(“F”)连接到ActionListener。按下时其余按钮不执行任何操作。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

问题是你只有两个变量(特别是类GUIBase的属性),并且每次创建一个新按钮时都会分配给它。因此,您只能引用最后一个按钮。

您需要一组按钮。我们来看看:

public class GUIBase extends JFrame {
    public final int MAX_BUTTONS = 96;
    private JButton[] buttons;
// ...
}

下一步是在开头创建数组:

public GUIBase() {
    super("Minesweeper");
    setLayout(new FlowLayout());

    this.buttons = new JButton[MAX_BUTTONS];


    //Fields
    int position;
    for (int i = 0; i < buttons.length; i++) {
        position = (int) (Math.random() * 100);

        this.buttons[ i ] = new JButton("R");
        this.buttons[ i ].setToolTipText("Is this the correct one?");
        this.add(this.buttons[ i ]);

        Action action = new Action();
        this.buttons[ i ].addActionListener(action);
    }
}

为了完全理解代码,您可能需要更多数组深度。基本上,数组是连续的变量集合,您可以按其位置编制索引,从0到n-1,n是位置数。

然后你可能会自己填补空白。

希望这有帮助。

答案 1 :(得分:3)

您的问题的一部分来自您的行动听众。

当然,一部分是你的代码可能需要一个列表/数组来跟踪所有创建的按钮;但至少现在,您可以在不使用数组/列表的情况下重新编写代码:

private class Action implements ActionListener {
public void actionPerformed(ActionEvent event) {
    System.out.println("Somethin");
    if (event.getSource() instanceofJButton) {
       JBUtton clickedButton = (JButton) event.getSource();
       String buttonText = clickedButton.getText();
       if (buttonText.equals("R") ...
       else if (buttonText.equals("F")

你知道,这里的重点是:截至目前,你只需要知道创建了什么样的按钮。并且你的ActionListener知道它被点击了哪个按钮......