我用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,但我不认为我可以通过它来揭示它们。欢迎任何建议。
答案 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);
}
}
}
}