揭示扫雷游戏中的所有空间

时间:2013-04-07 23:18:31

标签: java swing jbutton mouselistener minesweeper

我用jbuttons制作了一个扫雷游戏,我不知道如何再次访问所有按钮以显示失败后的最终游戏。我使用带有jbuttons的setText方法设置文本,但我不知道如何再次访问它们。这就是我创建所有按钮的方法,如果它有帮助:

    for(int x = 0; x < rows ;x++)
    {
        for(int j = 0; j < columns; j++)
        {
            MineButton button = new MineButton(x,j);
            // adds a mouselistener for every button
            button.addMouseListener(new MouseHandler());
            this.add(button);
        }
    }   

我可以将它改成一系列的jbuttons,但我不认为我可以通过它来揭示它们。欢迎任何建议。

1 个答案:

答案 0 :(得分:3)

您应该创建一些数组,它将是对所有按钮的存储引用。请参阅我的小例子,它可以帮助您了解它的工作原理:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MineSweeper {

    public static void main(String[] args) {
        MainFrame window = new MainFrame();
        window.setVisible(true);
    }
}

/**
 * Main frame. Initialize window and adds panel with buttons and clear button on
 * the window.
 * */
class MainFrame extends JFrame {

    private static final long serialVersionUID = 1L;

    private final Board board = new Board(10, 11);

    public MainFrame() {
        setLocation(400, 400);
        setLayout(new GridLayout(2, 1));
        add(board);
        add(createClearButton());
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private JButton createClearButton() {
        JButton button = new JButton();
        button.setText("Clear");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                board.clear();
            }
        });
        return button;
    }
}

/***
 * This class contains all buttons on one panel. We initialize all buttons in
 * constructor. We can use {@link Board#clear()} method for reveal all buttons.
 * */
class Board extends JPanel {

    private static final long serialVersionUID = 1L;

    private JButton[][] plate;
    private int numberOfRows;
    private int numberOfColumns;

    public Board(int numberOfRows, int numberOfColumns) {
        this.numberOfRows = numberOfRows;
        this.numberOfColumns = numberOfColumns;
        this.plate = new JButton[numberOfColumns][numberOfRows];
        setLayout(new GridLayout(numberOfRows, numberOfColumns));
        init();
    }

    private void init() {
        for (int x = 0; x < numberOfColumns; x++) {
            for (int y = 0; y < numberOfRows; y++) {
                JButton button = createNewJButton(x, y);
                plate[x][y] = button;
                add(button);
            }
        }
    }

    private JButton createNewJButton(int x, int y) {
        JButton button = new JButton();
        button.setText(x + ", " + y);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JButton button = (JButton) e.getSource();
                button.setText("X");
            }
        });
        return button;
    }

    public void clear() {
        for (int x = 0; x < numberOfColumns; x++) {
            for (int y = 0; y < numberOfRows; y++) {
                plate[x][y].setText(x + ", " + y);
            }
        }
    }
}