2016-10-20 13 views
-2

私は自分のスイングプログラムのテレタイプエフェクトを作成しようとしています。基本的に、JFrameを新しい文字で40ms刻みで更新し、ユーザーにメッセージを「タイピングする」ことを望んでいます。しかし、私がこれをしようとすると、それは多く点滅します。方法は以下の通りです:Java - setText()をすばやく使用しているときにテキストがちらつくのを防ぐ方法

public static void animateTeletype(String input, JTextArea displayArea) 
     throws InterruptedException { 
    displayArea.setText(""); 
    String s = ""; 
    for(int i = 0; i<input.length(); i++) { 
     s += input.substring(i, i+1); 
     displayArea.setText(textToDisplay); 
     Thread.sleep(40); 
     displayArea.update(displayArea.getGraphics()); 
    } 
} 

私はこの問題は、テキストの更新が速すぎることに由来し、処理できる以上の更新が必要であることを示しています。ティックタイムを短縮するとテキストのスクロールが遅すぎるため、この問題についてどうすればよいか分かりません。アドバイスありがとうございます!

**私はこの問題を解決しました。

static Timer timer = null; 
public static void animateTeletype(final String input, final JTextArea displayArea) throws InterruptedException 
    { 
     final String[] s = new String[1]; 
     s[0] = " "; 
     final int[] i = new int[1]; 
     i[0] = 0; 
     displayArea.setText("");  
     timer = new Timer(30, new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       s[0] = input.substring(i[0], i[0]+1); 
       i[0]++; 
       displayArea.append(s[0]); 
       if(displayArea.getText().equals(input)) 
        timer.stop(); 
      } 
     }); 
     timer.start(); 
    } 
+2

あなたの[EDT](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html)でそのコードを実行していないことを望みます。 – Tom

答えて

3
displayArea.update(displayArea.getGraphics()); 

update()メソッドを使用しないでください:これは私の新しいコードです。それを行う理由は決してありません。その声明を取り除く。

スイングコンポーネントは自動的に再描画されます。

displayArea.setText(textToDisplay); 

新しいテキストを追加するためにsetText(...)を使用しないでください。

代わりに、使用する必要があります。

displayArea.append("some more text"); 

をアニメーション用のThread.sleep(40)を使用しないでください。アニメーションが必要な場合は、Swing Timerを使用してアニメーションをスケジュールします。

スイングの基本については、このチュートリアルの他のセクションを参照することをお勧めします。たぶんHow to Use Text Fieldsのようなものでしょう。

+0

私は更新行を含めないとき、for文が完了するまでコンポーネントは更新されていないようです。それはちょっと待ってから、文字列全体が表示されます。 –

+0

気にしない、私は今働いている。乾杯! –

+1

@ThomasRichmond、あなたのソリューションが何だったか教えてください。他の人には役に立ちます。 –