gpt4 book ai didi

java - Action 监听器actionPerformed通过代码double执行

转载 作者:行者123 更新时间:2023-12-01 14:35:57 28 4
gpt4 key购买 nike

我已经在这个问题上磨练了一段时间了,但一直没能解决它。在这个内存游戏中,每次您选择一个按钮,然后选择左上角的按钮(第一次选择该按钮时),左上角的按钮就会变成绿色。这是因为每当您第一次选择左上方按钮并作为第二个选择时, public void actionPerformed(ActionEvent e) 中的代码就会执行两次。有什么想法可能会导致这种情况以及如何阻止它发生吗?

我确信有很多方法可以更好地创建内存游戏,但我讨厌在不知道出了什么问题的情况下继续前进。

感谢您的帮助。

所有代码:

public class Alt3_3 extends JFrame implements ActionListener {

JButton button[] = new JButton[52];
String[] kort = {"POTATIS", "GLASS", "UNIX", "GLAS", "FOSTERS", "AIGH",
"VAT 69", "SPIK", "FREDAG", "SITS", "FEST", "DaTe", "ALBIN",
"42", "BOTTLE", "SANDELS", "DEW", "STOL", "PETSKI", "LAGER", "STOUT",
"MALT", "EN RUTA", "BASS", "PrtScr", "DEL"};
String[] svar1;
String[] svar2;
boolean firstVald;
boolean green;
int score = 0;
int progress = 0;
int index1;
int index2;
String svark1;
String svark2;

Alt3_3() {
List<String> list1 = Arrays.asList(kort);
Collections.shuffle(list1);
svar1 = list1.toArray(new String[0]);
List<String> list2 = Arrays.asList(kort);
Collections.shuffle(list2);
svar2 = list2.toArray(new String[0]);

setLayout(new FlowLayout());
setPreferredSize(new Dimension(650, 700));
setTitle("Memorygame");

for (int i = 0; i < button.length; i++) {
button[i] = new JButton("");
button[i].setPreferredSize(new Dimension(100, 50));
add(button[i]);
button[i].addActionListener(this);
}

pack();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e) {


if (firstVald == false) {
resetRed();
firstVald = true;

int index = -1;
for (int i = 0; i < button.length; i++) {
if (e.getSource() == button[i]) {
index = i;
break;
}
}
index1 = index;

if (index % 2 == 1) {
button[index].setText(svar1[(index - 1) / 2]);
svark1 = svar1[(index - 1) / 2];
} else {
button[index].setText(svar2[index / 2]);
svark1 = svar2[index / 2];
}
button[index1].removeActionListener(this);

} else {


int index = -1;
for (int i = 0; i < button.length; i++) {
if (e.getSource() == button[i]) {
index = i;
break;
}
}
index2 = index;

if (index % 2 == 1) {
button[index].setText(svar1[(index - 1) / 2]);
svark2 = svar1[(index - 1) / 2];
} else {
button[index].setText(svar2[index / 2]);
svark2 = svar2[index / 2];
}

if (svark1 == svark2) {
progress++;
green = true;
button[index1].setBackground(Color.green);
button[index2].removeActionListener(this);
button[index2].setBackground(Color.green);
} else {
green = false;
score++;
button[index2].removeActionListener(this);
button[index1].setBackground(Color.red);
button[index2].setBackground(Color.red);

}
firstVald = false;

}
if (progress > 26) {
showMessageDialog(null, "grattis" + Integer.toString(score));
filhant.highScore(score);
System.exit(0);
}
}

public void resetRed() {
if (green == false) {
button[index1].setBackground(null);
button[index2].setBackground(null);
button[index1].setText("");
button[index1].addActionListener(this);
button[index2].setText("");
button[index2].addActionListener(this);
}
}

public static void main(String[] args) {
new Alt3_3();
}
}

最佳答案

对于两个按钮中的第一个,您总是调用resetRedresetRed 会将 addActionListener 添加到 index1index2 指示的按钮。由于它们被初始化为零,因此您安装了 Action 监听器的三个副本,并且代码不仅执行两次,而且执行三次:第一个作为不匹配对的第二个元素,第二个和第三个作为 a 的两个元素匹配的一对。避免第一次调用 resetRed

关于java - Action 监听器actionPerformed通过代码double执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16487313/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com