2016-04-09 9 views
-1

ここに私の問題を引き起こすいくつかのコードがあります。私は、温室の湿度を変更してJTextBoxに入れるアプリケーションを作成しています。湿度を変えるクラスと周囲の湿度を管理するクラスの2つのクラスがあります。 2つのクラスは1つのテキストボックスを共有し、問題は2つの値が互いに印刷されることがあることです。どうすればスレッドがテキストボックス入力と重ならないようにすることができますか?1つのJTextBoxを使用したマルチスレッド

private class humidControl implements Runnable { 
    public void run() { 
     try { 
        screen.setField(String.valueOf(calc.getHumid()), 21); 
        Thread.sleep(1000*humidTime); 
        while(on == true) { 
        calc.changeHumid(); 
        screen.setField(String.valueOf(calc.getHumid()), 21); 
        if(calc.getHumidifier()) 
         screen.setField("Humidifier is on", 24); 
        else if (!calc.getHumidifier()); 
         screen.setField("Humidifier is off", 24); 
        Thread.sleep(1000*humidTime); 


      } 

     } 
     catch (InterruptedException e) { 
      return; 
     } 
    } 
} 
private class AmbientHumid implements Runnable { 
    public void run() { 
     try { 
        while(on == true) { 
        calc.ambientHumid(); 
        screen.setField(String.valueOf(calc.getHumid()), 21); 
        Thread.sleep(1000*AhumidTime); 

      } 

     } 
     catch (InterruptedException e) { 
      return; 
     } 
    } 
} 
+0

このセクションはヘルプサイト:[someone answers](http://stackoverflow.com/help/someone-answers)からお読みください。 –

+0

なぜ同じフィールドを使用していますか?彼らは自分の畑を持っていてはいけませんか? – MadProgrammer

+0

また、スイングはスレッドセーフではないので、EDTをブロックしたり、EDTの外部からuiを更新したりしないでください。 – MadProgrammer

答えて

2

スウィングコンポーネントは、イベントディスパッチスレッド以外のスレッドから変更したり、アクセスしたりしないでください。スイングコンポーネントはスレッドセーフではなく、EDTに限定されています。他のスレッドのSwingUtilities.invokeLater()またはSwingUtilities.invokeAndWait()を使用してください。 SwingWorkerは、EDTを無効にして最後にSwingコンポーネントを変更しなければならない場合にも便利です。

+1

必要に応じてSwingWorkerまたはSwing Timerを使用する; – MadProgrammer

+0

ところでJTextBoxとは何ですか? –

+0

私は分かりません。私は彼がJTextFieldを意味していたと仮定します。しかし、Swingコンポーネントである限り、JTextField(setFieldメソッドを持たない)のJTextFieldやJTextFieldの独自のラッパーであっても、私の答えは真であり、タグとクラスの命名スタイルはそうです。 – Vampire

0

シンプルで、湿度の高い実行可能な出力では21で出力し、AmbientHumidの出力も21で出力します。AmbientHumidの出力は、例えば27で、オーバーラップは発生しません。