2016-05-26 7 views
1

私のプログラムに問題があります。ボタンハンドラがあり、JLabelを消してから1秒待ってから2番目のJLabelを消したいと思っています。私は自分のコードがうまくいくと思っていましたが、遅くなりましたが、メソッドが終了すると両方のJLabelが消えてしまいました。彼らは同時に消えて、これは私が望むものではありません。私のコードは以下の通りです。ご協力ありがとうございました!JLabelを一定期間後に消滅させるにはどうすればよいですか?

private void jButton14ActionPerformed(java.awt.event.ActionEvent evt) {           

    String numInputStr = inputBox.getText(); 
    int numInput = Integer.parseInt(numInputStr); 

    inputBox.setText(""); 

    if (numInput == 1) { 
     coin1.setVisible(false); 
     c1Visible = false; 
    } else if (numInput == 2) { 
     coin1.setVisible(false); 
     c1Visible = false; 
     coin2.setVisible(false); 
     c2Visible = false; 

    } else if (numInput == 3) { 
     coin1.setVisible(false); 
     c1Visible = false; 
     coin2.setVisible(false); 
     c2Visible = false; 
     coin3.setVisible(false); 
     c3Visible = false; 
    } else { 
     System.err.println("Invalid Input, try again"); 

    } 

    jButton14.setVisible(false); 

    try { 
     Thread.sleep(1000); 
    } catch (Exception E) { 

    } 

    if ((c1Visible == false) && (c2Visible == true) && (c3Visible == true)) { 
     coin2.setVisible(false); 
     coin3.setVisible(false); 
     coin4.setVisible(false); 
    } else if ((c2Visible == false) && (c3Visible == true) && (c1Visible == false)) { 
     coin3.setVisible(false); 
     coin4.setVisible(false); 

    } else if ((c3Visible == false) && (c4Visible == true)) { 
     coin4.setVisible(false); 
    } else { 
     System.out.println("Something went wrong, please try again"); 
    } 


} 
+5

。ボタンのactionPerformed()でsleep()を呼び出すとイベントスレッドがブロックされ、何も起きないようになります。 – FredK

答えて

5

私は私のコードは動作するだろうと思った、それは、しかし、両方のJLabel は、メソッドの終了後に遅延が消えません。あなたはスイングイベント処理があまりにも場所を取る必要がある場所とコンポーネントの作成/更新を受け取り、単一の、特別なスレッドであるEDTからThread.sleep()を呼び出すため

これは古典的なスイング並行性の問題が、あります。

このスレッドをブロックすると、GUIが再描画できなくなり、がフリーズされます。スレッドがSwing関連の処理を行う準備ができるまで。

あなたの目標を達成するために、Swing timerを使用して、指定された期間の後にそれらのラベルが消えるようにすることをお勧めします。この問題の詳細については

に見てみてください:あなたはこのためにタイマーを使用する必要が

関連する問題