我正在尝试使用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
。按下时其余按钮不执行任何操作。
我该如何解决这个问题?
答案 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知道它被点击了哪个按钮......