2013-06-08 2 views
1

첫 번째 스윙 응용 프로그램을 만들고 있습니다. 그것은 포커 카드를 사용하는 메모리 게임입니다.클릭 후 JLabel 아이콘을 변경하고 잠시 기다려주십시오.

JLabel을 사용하여 카드를 시뮬레이션하고 앞면과 뒷면에 아이콘을 설정합니다. 각 카드는 MouseListener이고 사용자가 클릭 할 때 두 개의 카드가 같은지 확인합니다. 두 장의 카드가 같은 카드가 아닌 경우이 두 장의 카드를 1 ~ 2 초 동안 표시하고이 지연 후에 아이콘을 다시 변경하십시오.

sleep, wait, invokeLater, invokeAndWait ...을 사용해 보았지만 아무것도 작동하지 않았습니다.

이 내 메인 클래스입니다 : JFrame에서

public class Main { 

    public static void main(String[] args) throws FontFormatException, IOException { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        MyApp window = new MyApp(); 
       } catch (FontFormatException | IOException ex) { 
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 
    } 
} 

MyApp 상속합니다.

while (cont < cardsInGame.size()){    
     this.cardsInGame.get(cont).setBounds(x, y, 100, 140); 
     panelTablero.add(cardsInGame.get(cont)); 
     cardsInGame.get(cont).addMouseListener(this); 

     x = x+108+5; 
     if ((cont+1)%8 == 0 && cont != 0){ 
      y = y+140+15; 
      x = 53; 
     } 
     cont++; 
} 

을 그리고 이것은의 MouseListener입니다 : 그 안에, 나는 하나 개의 패널에 내 모든 카드를 추가 내 코드에서 JOptionPane.showMessageDialog(vp, "Wait")에 전화를 넣어 경우

public void mouseClicked(MouseEvent e) { 

    Card selectedCard = (Card)e.getSource(); 

    if (selectedCard != activeCard){ 
     selectedCard.setIcon(new ImageIcon("img/"+selectedCard.getSuit()+selectedCard.getValue()+".png")); 

     //JOptionPane.showMessageDialog(vp, "Wait"); 

     if (activeCard != null && !activeCard.getPaired()) { 
      int result = activeCard.isPair(selectedCard); 
      pairsTried++; 
      if (result != 0){ 
       // PAIR 
      } 
      else{ 
       // I WANT TO WAIT HERE 
       // NO PAIR 
       selectedCard.setIcon(new ImageIcon(CARD_BACK)); 
       activeCard.setIcon(new ImageIcon(CARD_BACK)); 
      } 
      activeCard = null; 
     } 
     else{ 
      activeCard = selectedCard; 
     } 
    } 
} 

은 모두 잘 작동합니다. 아이콘이 새로 고쳐진 후 대화 상자가 표시 될 때까지 기다립니다. 그렇지 않으면 아이콘이 새로 고쳐지지 않습니다 (또는 초고속이며 표시되지 않습니다).

이 지연을 어떻게 추가 할 수 있습니까?

+0

스윙 타이머를 사용하십시오. 타이머가 작동하면 아이콘을 재설정합니다. – camickr

+0

또한 가능한 [예] (http://stackoverflow.com/questions/13617871/open-card-after-certain-time/13618136#13618136) – MadProgrammer

+0

감사합니다. MadProgrammer. 이 예제는 나에게 완벽하다. 내 애플 리케이션에서 시도하고 그것을 작동합니다! – Emerge

답변

-1

uadra를이 안에 넣으려고 했습니까?

 Runnable r = new Runnable() { 
      public void run() { 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      } 
     }; 
     Thread asd = new Thread(r); 
     asd.start(); 
+0

'Thread.sleep (2000);'EDT (Event Dispatch Thread)를 막지 마라. GUI는 그 때 '정지'할 것이다. 'Thread.sleep (n)'을 호출하는 대신에 태스크를 반복하기 위해 Swing Timer를 구현하거나 장시간 실행되는 태스크를 위해 SwingWorker를 구현하십시오. 자세한 내용은 [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. –

+0

의견에 링크 된 두 가지 예가 제시 한대로) – MadProgrammer

관련 문제