1

ユーザーがボタンを押すと、メッセージがテキスト領域に表示され、2〜3秒後に消えるコードがあります。

Thread.sleep(milliseconds) でこれを行う必要がありますが、機能していないようです (はい、try/catch とすべてで使用しています)。これが私のリスナーです:

 private class moveListener implements ActionListener
 {
    public void actionPerformed(ActionEvent e)
  {
        CardLayout cl = (CardLayout)(cards.getLayout()); 

        for(int i = 0; i < 4; i++)
        {
            for(int j = 0; j < 3; j++)
            {
                if(e.getSource() == move[i][j])
                {
                    turn++;
                    if(turn == 4)
                        turn = 0;


                    text.setText(""+SPRITES[i]+" has used " + move[i][j].getText() );

                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException ex) { }
                    text.setText("");


                    cl.show(cards, MAIN);

                }
            }
        }        
}

これを実行すると、プログラム全体がフリーズするのを感じることができます (おそらく sleep() メソッドが原因です)。言い換えれば、どこに行くべきか クリック > 表示 > 残り > 消去; クリック>残り>消去します。

私は他の方法を試しました: これは古典的な for(int i = 0; i < 9999999; i++) を 20 回のように実行していましたが、それは Thread.sleep() の方法と同じことをしました。

これを修正する方法はありますか?スレッドでUIを使用するのは悪いことについて読んだことがありますが、それが何を意味するのかわかりません....どんな助けも大歓迎です。

4

1 に答える 1

0
           text.setText(""+SPRITES[i]+" has used " + move[i][j].getText() );

           Thread t = new Thread(){
                 public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException ex) { }
                    SwingUtilities.invokeLater( new Runnable() {
                         text.setText("");
                         cl.show(cards, MAIN);                            
                    } );
                 }
           };
           t.start();

通常のパターンは次のとおりです。

「GUI スレッド」または EDT がありますが、どのように呼んでもかまいません。

GUI スレッドは、GUI で何かを行います。

次に、しばらく待機する新しいスレッドを開始します。

その間に、GUI スレッドは GUI の他の部分をレンダリングしたり、マウスに反応したりできます。

次に、新しいスレッドが起動し、Runnable オブジェクトを GUI スレッドに渡すことで、何をすべきかを GUI スレッドに伝えます (そうするにはいくつかの方法がありますが、ここでは一般的に使用される方法を使用しています)。

于 2013-05-19T20:42:39.740 に答える