2016-04-10 2 views
0

Я пишу простую графическую графическую игру, используя классы, которые происходят от JButton. Я создал сетку кнопок. У меня есть класс карты, который содержит цвет карты, и он «переворачивает» карту, меняя цвет фона. Я создал Card1 и Card2 в списке, который соответствует друг другу в фоновом цвете. У меня тяжелое время, когда я пытаюсь сопоставить свою карточку, а также когда пытаюсь отсрочить возврат карт. После того, как выбраны две карты, есть 1 секунда задержки, а затем карты должны вернуться назад, но всякий раз, когда я добавляю этот код, вторая карта никогда не отображает его цвет. Я использую Netbeans также IDE, если это делает разницуJava Matching Game

Вот мой 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; 

} 

ответ

1

Если вы звоните сна() (или делать что-нибудь еще, что занимает много времени) в Диспетчерский поток пользовательского интерфейса/события, ничто не будет отображаться. Способ исправить это использовать javax.swing.Timer

Timer t = new Timer(1000, new ActionListener() { 
    public void actionPerformed(ActionEvent ae) { 
    //restore the card's backgrounds here 
    } 
}); 
t.start(); 
+0

Я получаю исключение NullPointerException, когда я использую этот код. –