我正在使用从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;
}
答案 0 :(得分:1)
如果在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();