Java 在扫雷游戏中显示所有空间

Java 在扫雷游戏中显示所有空间,java,swing,jbutton,mouselistener,minesweeper,Java,Swing,Jbutton,Mouselistener,Minesweeper,我用jbuttons做了一个扫雷游戏,我不知道如何再次使用所有按钮来显示你输后的最后一个游戏。我使用setText方法和jbuttons设置文本,但我不知道如何再次访问它们。如果有帮助,我就是这样创建所有按钮的: for(int x = 0; x < rows ;x++) { for(int j = 0; j < columns; j++) { MineButton button = new MineButton

我用jbuttons做了一个扫雷游戏,我不知道如何再次使用所有按钮来显示你输后的最后一个游戏。我使用setText方法和jbuttons设置文本,但我不知道如何再次访问它们。如果有帮助,我就是这样创建所有按钮的:

    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);
        }
    }   
for(int x=0;x

我可以把它变成一个JButton数组,但我不认为我可以把它们全部显示出来。欢迎提供任何建议。

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

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);
            }
        }
    }
}
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共级扫雷艇{
公共静态void main(字符串[]args){
大型机窗口=新建大型机();
window.setVisible(true);
}
}
/**
*主框架。初始化窗口并添加带有按钮的面板,并清除打开的按钮
*窗户。
* */
类大型机扩展JFrame{
私有静态最终长serialVersionUID=1L;
私人最终董事会=新董事会(10,11);
公共主机(){
设置位置(400400);
setLayout(新的GridLayout(2,1));
增加(董事会);
添加(createClearButton());
包装();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
私有JButton createClearButton(){
JButton button=新JButton();
按钮。设置文本(“清除”);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
board.clear();
}
});
返回按钮;
}
}
/***
*此类包含一个面板上的所有按钮。我们初始化中的所有按钮
*构造器。我们可以使用{@linkboard#clear()}方法来显示所有按钮。
* */
类板扩展JPanel{
私有静态最终长serialVersionUID=1L;
专用JButton[]]板;
私有整数行;
私有整数列;
公共板(int numberOfRows,int numberOfColumns){
this.numberOfRows=numberOfRows;
this.numberOfColumns=numberOfColumns;
this.plate=new JButton[numberOfColumns][numberOfRows];
setLayout(新网格布局(numberOfRows,numberOfColumns));
init();
}
私有void init(){
对于(int x=0;x
按照您的建议保留一个jbuttons数组(或另一个数据结构,如arraylist),然后您可以迭代/枚举它们以执行您想要的任何操作。
“我可以将其更改为一个jbuttons数组,但我不认为我可以通过该数组全部显示它们…”
——的确,这将起作用,而且可以很好地发挥作用。您将如何着手将其初始化?你能在数组的每个部分创建一个新按钮吗?MineButton到底做什么?它是否存储按钮是否为炸弹或周围有多少炸弹的信息?或者是否有另一个数组处理该问题?其次,为什么不使用“MineButton[][]buttons=new MineButns[width][height];”创建一个MineButton数组,然后从循环中初始化该数组中的每个按钮?试试看!但这种应用程序是为使用数组而开发的。例如:@气垫船上满是鳗鱼,很有道理。谢谢你的建议。我改了。新名称-大型机。