2017-05-04 2 views
0

私はJava Swing Memory Gameを構築しています。最初のカードをクリックするのがアイデアです。イメージをbaseImageから別のイメージに変更します。 2枚目のカードをクリックすると、同じことをしてから数秒間待ってから、一致しない場合はすべて元に戻します。なぜ私のfirstCardClicked.setDisabledIcon(img)は機能しますが、私のsecondCardClicked.setDisabledIcon(img)は機能しません?

ここで、一致しない場合、2枚目のカードは決して画像を変更しません。以下は関連するコードです。彼らが一致すると、画像が表示され、すべてが正しく、世界で良いことに注意する必要があります。

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"); 
    } 
} 
+0

イベント処理では 'Thread.sleep(int) 'を使用しないでください。 GUIをブロックします。 –

+0

短い実行可能な例([MVCE](http://stackoverflow.com/help/mcve))も提供してください。 –

+0

@SergiyMedvynskyy初心者として、私はSwingでの問題のために 'Thread.sleep(int)'から離れようとしました。残念ながら、私はSwing Timerを正しく実装する方法を理解することができず、十分に機能しました。私は明日MVCEにこれを分解しようとします。すべてを感謝します。 –

答えて

0

同時に動作するいくつかの問題があるように見えます。 Thread.sleep()は、.setEnabled(true)コマンドと一緒に大混乱の原因となっていました。オブジェクトの状態は疑問だったので、コードの最後にそれらをクリアする必要がありました。 .setDisabledIcon()メソッドにはいくつかの既知の問題があります。ここには多くの投稿があり、先行するには.setIcon()が必要です。ここにはjavax.swing.Timerが使用されている固定コードがあります。

public void cardClickHandler(ActionEvent ae) 
{ 
    // method variables 
    JButton card = (JButton) ae.getSource(); 
    boolean clearState = false; 


    // behavior for first card clicked 
    if (isFirstCard) 
    { 
     firstCardClicked = card; 

     // a known issue with "setDisabledIcon()" required the "setIcon()" method 
     firstCardClicked.setIcon(new ImageIcon("images2/img" + firstCardClicked.getName() + ".jpg")); 
     firstCardClicked.setDisabledIcon(new ImageIcon("images2/img" + firstCardClicked.getName() + ".jpg")); 

     // disable the flipped card 
     firstCardClicked.setEnabled(false); 

     // indicate the next card clicked is the second card 
     isFirstCard = false; 
    } 
    // behavior for second card clicked 
    else 
    { 
     secondCardClicked = card; 

     // a known issue with "setDisabledIcon()" required the "setIcon()" method 
     secondCardClicked.setIcon(new ImageIcon("images2/img" + secondCardClicked.getName() + ".jpg")); 
     secondCardClicked.setDisabledIcon(new ImageIcon("images2/img" + secondCardClicked.getName() + ".jpg")); 

     // disable the flipped card 
     secondCardClicked.setEnabled(false); 

     // indicate the next card clicked is the first card again 
     isFirstCard = true; 

     // indicate to the system both cards have been clicked and can clear objects 
     clearState = true; 
    } 

    // behavior if two cards have been clicked and they match 
    if (isFirstCard && firstCardClicked.getName().equals(secondCardClicked.getName())) 
    { 
     // player turn control and scoring 
     if (p1Turn) 
     { 
      p1NumScore++; 
      p1Score.setText(Integer.toString(p1NumScore)); 
      scorePanel.revalidate(); 
      p1Turn = !p1Turn; 
     } 
     else 
     { 
      p2NumScore++; 
      p2Score.setText(Integer.toString(p2NumScore)); 
      scorePanel.revalidate(); 
      p1Turn = !p1Turn; 
     } 
    } 
    // behavior if two cards have been clicked and they do not match 
    else if (isFirstCard && !(firstCardClicked.getName().equals(secondCardClicked.getName()))) 
    { 
     // enable the cards and reset images 
     firstCardClicked.setIcon(BASE_IMAGE); 
     secondCardClicked.setIcon(BASE_IMAGE); 

     // change turns 
     p1Turn = !p1Turn; 
    } 
    if (clearState) 
    { 
     javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener() { 
      public void actionPerformed(ActionEvent ae) { 

         firstCardClicked.setEnabled(true); 
         secondCardClicked.setEnabled(true); 
         isFirstCard = true; 
         firstCardClicked = null; 
         secondCardClicked = null; 

      } 
     }); 

    // Normally the timer's actionPerformed method executes repeatedly. Tell it only to execute once. 
    timer.setRepeats(false); 

    // Start the timer. 
    timer.start(); 
    } 
} 
関連する問題