0
public void actionPerformed(ActionEvent e) {
        String sp1="Player 1's turn. ";
        String sp2="Player 2's turn. ";
          System.out.println("Mouse entered for rating " + index);  //helps me track the cards
           ori=new ImageIcon(getClass().getResource(index+1+".png")); //set the image to the card

        ori.setDescription("ori");  //It's weird that I cannot directly flip the card, so I used this method to flip the cards.
        tail.setDescription("tail");//http://stackoverflow.com/questions/13557561/the-method-about-imageicons-does-not-work


        if (((ImageIcon) bt[index].getIcon()).getDescription()=="ori")
            bt[index].setIcon(tail);
         else
            bt[index].setIcon(ori);

        count++;

       System.out.printf("Action Performed %d times \n",count);
         if(count==1){  //if the card is clicked for once, the card should not flip and the index is stored in record.
           record=index;
           countS++;

       }
       String turnS=Integer.toString(countS);//parse the int and printout the turn 
     //  text3.setText(sp1+"This is turn "+turnS);
       if(count==2){
           int match1=record/4;   //Since every four cards have the same rank, I used this to get the rank very easily
           int match2=index/4;
          if(match1==match2&&record!=index){  //compare the two cards clicked
              p1++;
              score1=Integer.toString(p1);   
              text1.setText("Player 1: "+score1);  //display the score
              text3.setText(sp2+"This is turn "+turnS);
              bt[index].setEnabled(false);//remove the cards that match
              bt[record].setEnabled(false);
          }
          if(record==index){
              text3.setText(sp2+"This is turn "+turnS);//designed for the situation that the user clicks the same card
          }
          if(match1!=match2){//designed for the situation that the two cards do not match
           //time.schedule(taskFlip1,500);//delay the flip so that the user can see the cards
           //time.schedule(taskFlip2,500);


              try{   **//This part is problematic!**

                  Thread.currentThread().sleep(4000);
                  flip(index);
                  flip(record);


                }
                catch(Exception ie){

                }
              }
          text3.setText(sp2+"This is turn "+turnS);


       }

ボタンをクリックすると、ボタンは ImageIcon を変更するはずです。スリープなしで問題なく動作します。しかし、スリープを追加した後、ボタンをクリックすると、プログラムは ImageIcon を変更せずに一時停止します! なぜか教えてくれますか?ありがとうございました!

4

3 に答える 3

1

このactionPerformed()メソッドは、イベントディスパッチスレッドで実行されます。再塗装システムもそうです。あなたが眠るなら、あなたは絵を延期している、そして他のすべて。このスレッドで眠ってはいけません。延期されたペイントが必要な場合は、SwingWorkerまたはを使用javax.swing.Timerして延期されたタスクを開始します。

于 2012-11-28T22:13:03.653 に答える
1

アクションは、描画も処理するスレッドによって実行されます。あなたはこのスレッドをブロックします。何も見えません。ゲームオーバー。

これが、イベント ディスパッチャ スレッドをブロックしたり遅延させたりしてはならない理由です。

「イベント ディスパッチャ スレッド」および「ブロッキング」という用語を検索すると、詳細を説明する多くの情報が見つかります。

于 2012-11-28T22:12:09.243 に答える
1

ActionPerformed は、イベント ディスパッチャ スレッドで実行されます。そこで寝ると、UI の更新が停止します。

代わりに Swing Timer を使用して、アクションを遅らせることができます。

于 2012-11-28T22:12:11.263 に答える