4

基本的に、私はこのゲームを持っています。一度正しい答えを推測すると、新しい単語で新しいゲームが始まります。表示したいのですCorrect!が、3秒後に空の文字列に変更します。それ、どうやったら出来るの?

私の試み:

if (anagram.isCorrect(userInput.getText()))
    {

        anagram = new Anagram();
        answer.setText("CORRECT!");
        word.setText(anagram.getRandomScrambledWord());
        this.repaint();
        try
        {
        Thread.currentThread().sleep(3000);
        }
        catch (Exception e)
        {
        }
        answer.setText("");

    } else
    {
        answer.setForeground(Color.pink);
        answer.setText("INCORRECT!");
    }

編集:

私の解決策:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
    {
        // TODO add your handling code here:
    if (anagram.isCorrect(userInput.getText()))
    {
        answer.setText("CORRECT!");

        ActionListener taskPerformer = new ActionListener()
    {
    public void actionPerformed(ActionEvent evt)
    {
        anagram = new Anagram();
        word.setText(anagram.getRandomScrambledWord());
        answer.setText("");
        userInput.setText("");
    }
    };
    Timer timer = new Timer(3000, taskPerformer);
    timer.setRepeats(false);
    timer.start();
    } else
    {
        answer.setForeground(Color.pink);
        answer.setText("INCORRECT!");
    }
    }

よくわかりませんが、MadProgrammer のアドバイスに従い、イベント自体をブロックするのではなく、新しいスレッドをブロックしていることを願っています。Javaタイマーも調べてみます。

4

3 に答える 3

7

Swingは、イベント駆動型の環境です。イベントディスパッチスレッドをブロックしている間は、新しいイベントを処理できません。

時間のかかるプロセス(I / O、ループなどThread#sleep)でEDTをブロックしないでください。

詳細については、イベントディスパッチスレッドをお読みください。

代わりに、を使用する必要がありますjavax.swing.TimerActionListener所定の遅延後にをトリガーします。

その利点は、actionPerformedメソッドがイベントディスパッチスレッドのコンテキストで実行されることです。

例については、これまたはこれまたはこれまたはこれをチェックしてください

于 2012-12-11T01:39:09.810 に答える
0

これらのコードがイベント ハンドラーにある場合、UI スレッドが停止していることになり、UI の更新はイベント ハンドラーでの作業が終了した後にのみ行われるため、機能しません。

「3秒間スリープし、テキストフィールドを変更し、再描画をトリガーする」という作業を行う別のスレッドを作成する必要があります。Timer や同様のユーティリティを使用するのが、ここで説明したことを実現する最も簡単な方法です。

于 2012-12-11T01:30:55.797 に答える