2012-01-30 16 views
4

私は大部分のためにしたいタイプライタークラスを作りました。与えられた文字列を一度に1文字ずつ出力し、入力されたものと同じように各文字列の間で一時停止し、ピリオドの後にもう少し休止します。私が今問題を抱えているのは、このクラスを使うときには一度しか動かないということです。私はそれを2度(またはそれ以上)呼び出すと、同時にそれらを実行しようとします。これは大きな問題を引き起こします。ですから、このクラスの最初のインスタンスを実行する方法と、開始する前に "それのターン"を待つ方法が必要です。以下は、望ましいアウトカムと電流の例です。JTextAreaによるタイプライター効果

import objectdraw.*; // Where active object comes from.  
import javax.swing.JTextArea; 

public class Typewriter extends ActiveObject { 

    private JTextArea out; 
    private String in; 

    public Typewriter(String s, JTextArea output) { 

    in = s; 
    out = output; 
    start(); 

    } 

    public void run() { 

    synchronized(out) { 

     for(int i=0; i<in.length(); i++) { 

     out.append(in.substring(i,i+1)); 
     if(in.charAt(i) == '.') { 
      pause(30); 
     } else { 
      pause(200); 
     } 

     } 

    }  

    } 

} 

電流:

CODE: 新しいタイプライター( "\ nHello"、出力)。 新しいタイプライター( "\ nWorld"、出力);

CURRENT OUTPUT

HW ol elr ldo 

もちろん、私はタイプライタークラスからコードの大部分を残し

Hello 
World 

所望の出力。それが本当に必要なら、私はそれを投稿することができます。 ActiveObjectのjavadocsは hereです。これは私がスレッドを教えられた方法で、私はそれが問題であるかもしれないと恐れています。

EDIT:

I以下の答えPERが同期(アウト)の行を追加しましたが、私は、コードを実行しようとすると、私はNullPointerExceptionが取得しています。

Exception in thread "main" java.lang.NullPointerException 
    at objectdraw.ActiveObject.<init>(ActiveObject.java:239) 
    at com.caldwellysr.TBA.Typewriter.<init>(Typewriter.java:11) 
    at com.caldwellysr.TBA.Client.initGame(Client.java:78) 
    at com.caldwellysr.TBA.Client.<init>(Client.java:66) 
    at com.caldwellysr.TBA.Client.main(Client.java:24) 

タイプライター11行は、コンストラクターのヘッダーです。 クライアントライン78は私が新しいタイプライター( "Testing"、output)と呼ぶ場所です。出力はJTextArea クライアントライン66は、タイプライターが入っているinitGame()の呼び出しです クライアントライン24はJFrameコンストラクタです。

+0

はい、コードが必要です。投稿してください。 – Abbas

+0

いいえ... – CaldwellYSR

+0

FIFOタスクキューのようなものを使用したいと思うかもしれません。 –

答えて

3

Threadクラスを継承し、非同期に実行されるため、スレッドがいつ実行されるか分かりません。 2 ActiveObjectインスタンスを作成すると、2 forループが必ずしも順番に実行されるわけではありません。表示される結果は、テキスト領域が同時に2つのスレッドによって更新されることです。

EDIT:

あなたはSYNCHRONIZED句と同期して、あなたのコードを実行することができます。

synchronized(out){ 
    for(int i=0; i<in.length(); i++) { 
     out.append(in.substring(i,i+1)); 

     if(in.charAt(i) == '.') { 
      pause(30); 
     } 
     else { 
      pause(200); 
     } 
    }  
} 
+0

目的の出力を得る唯一の方法は、ActiveObjectを使用しないことです。 – CaldwellYSR

+0

私が追加したコードを見てみましょう。これは、ThreadクラスまたはThreadから継承する他のクラスから継承したクラスで機能します。 – Abbas

+0

これは正しい答えのように見えますが、私は奇妙なnullpointerexceptionを取得しているので、それがうまく動作しているかどうかは分かりません。その部分を見つけ出し、それがうまくいくかどうかを判断するとき、私はこれを正しい答えにします。 – CaldwellYSR

1

私の最後の答えはjavascriptのためにあったが、しかし、理論は同じでなければなりません。あなたの場合は、毎回新しいオブジェクトを作成する必要はありません。一度新しいオブジェクトを作成するだけで、新しい単語をJTextAreaに入れたいときには、クラス内の関数を呼び出して新しい文字列を "in"文字列に追加することができます。クラスのtime関数を作成して、定期的に新しい文字を "in"文字列に出力します。

このような何か:。

輸入objectdraw *; //アクティブオブジェクトがどこから来るか。
import javax.swing。JTextArea;

public class Typewriter extends ActiveObject { 

    private JTextArea out; 
    private String in; 
    private int index; 

    public Typewriter(String s, JTextArea output) { 

    in = s; 
    index = 0; 
    out = output; 
    start(); 

    } 

    public void run() { 

    while (1) { 
     if (index < in.length) { 
      out.append(in.substring(index,index+1)); 
      index++; 
     } 

     pause(200); 
    }  
    } 

    public void add_string(String s) { 
     in += s; 
    } 

} 

次に、あなたが呼び出すことができます。 タイプライターTW =新しいタイプライター( "こんにちは"); tw.add_string( "world");

+0

文字列。 – akf

0

これは、このコードを使用すると非常に簡単な方法です。役立つはずです。ミル秒単位で時間変数を変更することで、より高速にすることができます。あなたが他のクラスではどうなるのか

import javax.swing.JTextArea; 

public class TypeWriter { 

private static final long time = 100; 

public static void TypeWriterEffect(String s, JTextArea output) { 

    String[] words = s.split(""); 


    for (String word : words) 
    { 
     output.append(word); 

     try { 
     Thread.sleep(time); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    } 
    } 
} 

これです:

static JTextArea textWindow; 
TypeWriter.TypeWriterEffect("This is a Type Writer effect", textWindow); 

今すぐドンのちょうど私が入れた変数を入れて、それはちょうどので、あなた自身を使用使用する変数を入力する内容を示すことですJFrameまたはJPanelに追加したJTextArea変数。

希望します。

関連する問題