【发布时间】:2017-05-04 03:54:18
【问题描述】:
我正在构建一个 Java Swing 记忆游戏。这个想法是点击第一张卡片,它将图像从baseImage更改为另一个图像。当第二张卡片被点击时,它应该做同样的事情,等待几秒钟,然后如果它们不匹配则将所有内容重置回基础,如果匹配则将它们翻转过来。
现在,如果它们不匹配,第二张卡片永远不会改变图像。下面是相关代码。应该注意的是,如果它们确实匹配,则图像显示并且世界上一切都是正确和美好的。
public void cardClickHandler(ActionEvent ae) {
JButton card = new JButton();
card = (JButton) ae.getSource();
// disable the card that was clicked
card.setEnabled(false);
// behavior for first card clicked
if (clickCounter == 0) {
firstCardClicked = card;
img = new ImageIcon("images2/img" + firstCardClicked.getName() + ".jpg");
firstCardClicked.setDisabledIcon(img);
System.out.println("Button " + firstCardClicked.getName() + " clicked!");
clickCounter++;
}
// behavior for second card clicked
else {
secondCardClicked = card;
img = new ImageIcon("images2/img" + secondCardClicked.getName() + ".jpg");
secondCardClicked.setDisabledIcon(img);
System.out.println("Button " + secondCardClicked.getName() + " clicked!");
clickCounter--;
}
// behavior if two cards have been clicked and they match
if (firstCardClicked.getName().equals(secondCardClicked.getName()) && clickCounter == 0) {
// player turn control and scoring
if (p1Turn) {
p1NumScore++;
p1Score.setText(Integer.toString(p1NumScore));
scorePanel.revalidate();
System.out.println("Good job Mike, got a pair!");
p1Turn = !p1Turn;
}
else {
p2NumScore++;
p2Score.setText(Integer.toString(p2NumScore));
scorePanel.revalidate();
System.out.println("Good job Peanut, got a pair!");
p1Turn = !p1Turn;
}
}
// behavior if two cards have been clicked and they do not match
else if (!(firstCardClicked.getName().equals(secondCardClicked.getName())) && clickCounter == 0) {
// keep cards flipped for a few seconds
try {
System.out.println("Before Sleep"); // testing
Thread.sleep(2000);
System.out.println("After Sleep"); // testing
}
catch (Exception e) {
e.printStackTrace();
}
// enable the cards and reset images
firstCardClicked.setEnabled(true);
firstCardClicked.setIcon(baseImage);
secondCardClicked.setEnabled(true);
secondCardClicked.setIcon(baseImage);
// change turns
p1Turn = !p1Turn;
System.out.println("Keep Playing");
}
}
【问题讨论】:
-
不要在事件处理中使用
Thread.sleep(int)。它会阻止 GUI。 -
还请提供一个简短的可运行示例 (MVCE)。
-
@SergiyMedvynskyy 作为初学者,我试图远离
Thread.sleep(int),因为它与 Swing 存在问题。不幸的是,我无法找到正确实现 Swing Timer 的方法,而且效果很好。明天我将尝试将其分解为 MVCE。欣赏一切。