2011-10-27 4 views
2

こんにちは私はプロジェクト(カードマッチゲーム)に取り組んでいますが、ほとんど終わっていますが、そうでなければ画像を開くために2番目のボタンをクリックしたときです最初は突然閉じた。よく知られていることは間違っていますが、ユーザーはしばらく(2秒程度)写真を見なければなりません。だから私はThread.sleep(2000)を使用しましたが、私は正しく動作しません。アイコンをヌルに設定してから2秒間待つことを開始します。 SSCCEを作成しようとしたのが私のコードです。2枚の写真をJavaのメモリゲームでしばらく開いたままにする

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.Image; 
import java.awt.Menu; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.util.Random; 
import java.util.Vector; 

import javax.swing.BorderFactory; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JToggleButton; 
import javax.swing.UIManager; 
import javax.swing.border.*; 

public class ConcentrationGame3 extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private int buttoncounter=0; 
    private int counter = 0; 
    private JFrame frame; 
    private JPanel mainPanel; 
    private JPanel buttonPanel; 
    private JMenuBar menuBar; 
    private JMenu menu; 
    private JMenuItem menuItem; 
    private int[] arr = new int[16]; 
    private int i,j; 
    private int random; 
    private int size = 4; 
    private Icon hidden; 
    private GameButton buttonFirst; 
    private GameButton buttonSecond; 
    int k=0; 

    private Icon img[] = {UIManager.getIcon("OptionPane.errorIcon"), 
      UIManager.getIcon("OptionPane.informationIcon"), 
      UIManager.getIcon("OptionPane.warningIcon")}; 

    private Icon iconList[] = new ImageIcon[size]; 

    public ConcentrationGame3(){ 

     createArray(); 
     initComponents(); 

    } 


    private void initComponents(){ 


     frame = new JFrame("Concentration Game"); 

     menuBar = new JMenuBar(); 
     menu = new JMenu("Menu"); 

     frame.setJMenuBar(menuBar); 

     menuBar.add(menu); 

     menuItem = new JMenuItem("New Game"); 
     menu.add(menuItem); 

     menuItem = new JMenuItem("Solve"); 
     menu.add(menuItem); 

     menuItem = new JMenuItem("Exit"); 
     menu.add(menuItem); 

     mainPanel = new JPanel(new BorderLayout(5, 5)); 
     mainPanel.setBorder(new EmptyBorder(4,4,4,4)); 

     frame.setContentPane(mainPanel); 

     buttonPanel = new JPanel(new GridLayout(4,4,5,5)); 
     buttonPanel.setBackground(Color.green); 

     for(i=0; i<4; i++){ 

      final GameButton button = new GameButton(new JToggleButton(),iconList[i]); 
      button.addItemListener(new ItemListener(){ 
       public void itemStateChanged(ItemEvent e){ 

        button.setState(); 
       } 
      }); 

      button.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 

         try { 
          buttonActionPerformed(e,button); 
         } catch (InterruptedException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } 
       } 
      }); 
      buttonPanel.add(button); 
     } 



     mainPanel.add(buttonPanel, BorderLayout.CENTER); 


     frame.setSize(300, 300); 
     //frame.pack(); 
     frame.setLocation(300, 300); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    class GameButton extends JToggleButton{ 

     private static final long serialVersionUID = 1L; 
     private JToggleButton gameButton; 
     private Icon icon; 

     public GameButton(JToggleButton gameButton,Icon icon){ 

      this.gameButton = gameButton; 
      this.icon = icon; 
     } 

     public void setState() { 
       if (this.isSelected() || !this.isEnabled()) { 
        this.setIcon(icon); 
       } else { 
        this.setIcon(hidden); 
       } 
      } 
     } 

    private void buttonActionPerformed(ActionEvent e, GameButton button) throws InterruptedException { 
     if(button.isSelected()){ 
      buttoncounter++; 

      if(buttoncounter==1){ 
       buttonFirst = (GameButton) e.getSource(); 
      } 
      else if(buttoncounter==2){ 
       buttonSecond = (GameButton) e.getSource(); 
       buttoncounter=0; 

        if(checkPairs(buttonFirst,buttonSecond)) { 
         retirePair(buttonFirst,buttonSecond); 
        } 

        else{ 
          Thread.sleep(2000); 
          buttonFirst.setIcon(hidden); 
          buttonFirst.setSelected(false); 
          buttonSecond.setIcon(hidden); 
          buttonSecond.setSelected(false); 

        } 

      } 
     } 
    } 

    private void retirePair(GameButton a, GameButton b){ 
     a.setSelected(true); 
     a.setEnabled(false); 
     b.setSelected(true); 
     b.setEnabled(false); 
    } 

    private boolean checkPairs(GameButton first, GameButton second){ 

     if(first.getIcon().equals(second.getIcon())) 
      return true; 
     else 
      return false; 

    } 

    private void createArray(){ 

     Random rnd = new Random(); 

     while(i<4){ 

      random = rnd.nextInt(3)+1; 

      if(!includes(random)){ 
       arr[i]=random; 
       iconList[i] = img[random-1]; 
       i++; 
      } 
     } 
    } 

    public boolean includes(int rnd){ 

     counter=0; 

     for(j=0; j<arr.length; j++){ 

      if(arr[j] == rnd){ 
       counter++; 
       if(counter>1) 
        return true; 
      } 
     } 

     return false; 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     new ConcentrationGame3(); 

    } 

} 

お手伝いできれば幸いです。とにかくありがとう:)

+1

いいえ、あなたはSSCCEにしませんでした。質問にすべてのコードを書き留めて、「何が間違っていますか?」と尋ねました。 –

+2

あなたの 'GameButtonはJToggleButtonを拡張していますが、' JToggleButton'もコンストラクタのためにそのクライアントによって構築される 'JToggleButton'と' _Stores_''JToggleButtonも必要とするのは奇妙です。私がJavaを想起したことから、 'extends'は「is-a」関係ですが、あなたはそれが「has-a」関係であるかのように使っています。 – sarnold

+0

@ブライアンええ、しかし、このコードは100行以上と私のコンピュータ上で特に使用する画像があります。 "私はコードをお願いします。"というような質問はしません。慎重に読んでください... – quartaela

答えて

6

スイングスレッドでThread.sleepを使用したくないのですが、何か検索しても読んでいると確信していますので、これは何ですか。Swingはスリープ状態になり、スリープ状態になると、すべての描画が固定され、すべてのユーザー操作(ボタンへの応答など)が固定されます。代わりにSwingタイマーを使用して、Swingが2番目の画像を描画して2秒間または3秒間表示することを防ぐことなく、アプリケーションを一時停止することができます。ロジックは次のようになります:両方の画像を表示し、タイマーを開始し、タイマーが2〜3秒後に(または何か遅延を設定していても)タイマーしたら、タイマーのActionListener内の画像を非表示にします。

また、タイマーを非繰り返しとして設定するようにしてください(これを行うSwing Timerのブールメソッドがあります)。また、2つのイメージが表示されている間に、すべてのJToggleButtonsを応答しない(または有効にする== false)ようにしたい場合は、Timerが、ペアになっていないすべてのボタンを、 "

+0

@quartaela:このリンクをブックマークしておいてください:[The Really Big Index](http://download.oracle.com/javase/tutorial/reallybigindex.html)。次にそのページでSwing Timersを検索します。 –

+0

これは感謝しています。 – quartaela

+0

あなたは大歓迎です! –

関連する問題