2009-11-25 11 views
5

私の主なアプリケーションクラスでは、私はJTextArea(txtAreaと言う)のオブジェクトを持っています。私はmain_applicationプログラムに2つの別のスレッドを作成しました。私が作成した2つのスレッドは、シリアルポートでの読み書き用です。今は、シリアルポートの読み込みバッファのデータをJTextAreaオブジェクトに入れたいと思います。したがって、main_applicationで作成されたJTextAreaオブジェクトを読み取りスレッドに渡して、読み取りスレッドが読み取り出力をJTextAreaに渡せるようにする必要があります。メインスレッドからJavaの別のスレッドにオブジェクトを渡す方法

しかし、このようにした後、私はnullポインタのアクセスの問題に直面しています。 main_applicationのJTextAreaオブジェクトをチェックするとnullではなく、スレッドに渡された後にnullがチェックされます。私はあなたが読むことをお勧めします、

おかげで、 Surjya

+0

どのようにオブジェクトを渡していますか?あなたの問題を示す十数行のコードを提供できますか? – Suppressingfire

答えて

1

は、スレッド間のオブジェクトは非常に厄介取得することができます共有....任意のオタクが私を助けることができる場合、私は幸せになります....それが起こるか知りません別のアプローチの場合はActor modelです。具体的にはGUIの分野では、Model-View-Controllerのアプローチコードが役立ちます。

しかし、バックの問題、あなたはすぐにあなたのJTextAreaに静的変数を作り、ちょうどすべての異なるスレッドが意志で静的インスタンスを変更させることで、それをハック可能性:

シリアル読書のスレッドで、その後
public static JTextArea TXTAREA 

void main_application(){ 
    //set up app 
    ... 
    TXTAREA = new JTextArea() 
    ... 
} 

TXTAREAのテキストを設定します。このソリューションは理想的ではありませんが、私はより良いアプローチは、MVCのアプローチを使用し、テキスト領域に配置する値を受け入れるコントローラがあると思います。

+0

'TXTAREA'は揮発性ではありませんか? (免責事項:私はまだ実際にはjava並行処理を読んでいないが、それは私のリストにある:)) – wds

0
  1. 他のスレッドへのJTextArea参照の公開は正しくありません。スイングコンポーネントはMVCベース(実際はモデル-ui)であるためです。したがって、スイングコンポーネントで作業する一般的な方法は、モデルを更新してビュー(UI)に変更を表示させることです。
  2. スイングコンポーネントのほとんどはスレッドセーフではありません。すなわち、EDT以上のスレッドからswingコンポーネントを使用するとアプリケーションが正常に動作することを確認できません。

だから、あなたは次のことを行う必要がありますたびにあなたがJTextAreaにのEDTから実行するコンテンツ更新を新しいタスクを送信表示する新しいデータを持っています。 SwingUtilities.invokeLater()

2

別の応答で説明したように、スイングスレッド自体のSwingコンポーネントの内容のみを変更できます。他のすべてのスレッドがこれを行うようにするには、実際のJTextAreaを公開するのではなく、他のオブジェクトにmain_applicationからテキスト領域にテキストを追加する安全なメソッドを提供することです。 public class main_application {

private JTextArea txtArea; 

public void addText(final String txt) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      txtArea.setText(txtArea.getText() + txt); 
     } 
    }); 
} 

}

これは簡単な例ですが、必要に応じてこれを拡張することができます。これは、2つの不変な文字列を追加するので、テキストに追加するコストがかかります。 JTextArea.getDocument()を使用してモデルを取得し、文書内の突然変異メソッドを使用してテキストをより効率的に更新することができます。しかし、このような方法を提供することで、将来他のスレッドやオブジェクトに影響を与えずに実装を変更することができます。

パラメータ txtは最終的なものであり、匿名の内部クラスで直接参照できるようにする必要があります。

これをメインアプリケーションクラスから切り離し、他のスレッドからテキスト領域を操作したいメソッド/ウェイのインターフェイスまたはクラスを作成し、このテキスト領域をラップします。

関連する問題