我正在使用从 JButton 派生的类编写一个简单的 GUI 匹配游戏。我创建了一个按钮网格。我有一个 Card 类,其中包含卡片的颜色,它通过更改背景颜色来“翻转”卡片。我在一个列表中创建了 Card1 和 Card2,它们的背景颜色相互匹配。当我试图匹配我的卡以及试图延迟卡翻回时,我遇到了困难。选择两张卡后,有 1 秒的延迟,然后卡应该翻转回来,但每当我添加该代码时,第二张卡永远不会显示它的颜色。我正在使用 Netbeans 作为 IDE,如果这有什么不同的话
这是我的 Card.java
package mygui;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
interface FlipListener
{
void flipped(Card card);
}
public class Card extends JButton{
private List<FlipListener> listeners = new ArrayList<FlipListener>();
private Color backColor;
public final Color originalColor;
public void AddListener(FlipListener listener)
{
listeners.add(listener);
}
public Card(Color color)
{
originalColor = getBackground();
backColor = color;
//Click action Listener
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(getBackground().equals(backColor))
{
setBackground(originalColor);
}
else
{
setBackground(backColor);
}
for(FlipListener flipListener: listeners)
{
flipListener.flipped((Card)e.getSource());
}
}
});
}
}
这是我的 FormMain.java
package mygui;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
public class FormMain extends javax.swing.JFrame{
//Creates the form and adds the cards
public FormMain()
{
setSize(1000, 750);
myCards = new ArrayList<Card>();
for(int i = 0; i < 18; i++)
{
Random r = new Random();
Color color = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
Card card1 = new Card(color);
Card card2 = new Card(color);
card1.setText("Card1");
card2.setText("Card2");
myCards.add(card1);
myCards.add(card2);
card1.AddListener((card)->{
if(selectedCard1 == null)
{
selectedCard1 = card;
selectedCard1.setText("Card 1 selectedCard1");
}
else if(selectedCard2 == null)
{
selectedCard2 = card;
selectedCard2.setText("Card 1 selectedCard2");
//check for match with selectedCard1
if(selectedCard1.getBackground() == selectedCard2.getBackground())
{
selectedCard1.setText("Clicked SC1");
selectedCard2.setText("Clicked SC2");
Color black = new Color(0,0,0);
card1.setBackground(black);
card2.setBackground(black);
}
// if(selectedCard1 == card1) //works only one way
// //I am selecting myself
// {
// Color black = new Color(0,0,0);
// //card2.setBackground(black);
// card1.setBackground(black);
//
// }
try {
//delay for 1 sec
Thread.currentThread().sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(FormMain.class.getName()).log(Level.SEVERE, null, ex);
}
//flip the cards back over
selectedCard1.setBackground(card1.originalColor);
selectedCard2.setBackground(card1.originalColor);
selectedCard1 = null;
selectedCard2 = null;
}
});
card2.AddListener((card)->{
if(selectedCard1 == null)
{
selectedCard1 = card;
selectedCard1.setText("cArd 2 selected card 1");
}
else if(selectedCard2 == null)
{
selectedCard2 = card;
selectedCard2.setText("Card 2 selected card 2");
//check for match with selectedCard1
if(selectedCard1.getBackground() == selectedCard2.getBackground())
{
Color black = new Color(0,0,0);
card1.setBackground(black);
card2.setBackground(black);
}
try {
//delay for 1 sec
Thread.currentThread().sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(FormMain.class.getName()).log(Level.SEVERE, null, ex);
}
// flip the cards back over
selectedCard1.setBackground(card2.originalColor);
selectedCard2.setBackground(card2.originalColor);
selectedCard1 = null;
selectedCard2 = null;
}
});
}
Collections.shuffle(myCards);
for (Card card : myCards)
{
add(card);
}
GridLayout layout = new GridLayout(6,6);
getContentPane().setLayout(layout);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
java.awt.EventQueue.invokeLater(new Runnable(){
@Override
public void run() {
new FormMain().setVisible(true);
}
});
}
private ArrayList<Card> myCards;
Card selectedCard1;
Card selectedCard2;
}
最佳答案
如果您在 UI/事件调度线程上调用 sleep() (或执行任何其他需要很长时间的操作),则不会呈现任何内容。解决这个问题的方法是使用 javax.swing.Timer
Timer t = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent ae) {
//restore the card's backgrounds here
}
});
t.start();
关于Java配对游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524914/