2016-05-14 6 views
-3

私はJTextAreaとJButtonの名前を持つメインのJFrameを持っています。 私はボタンを押すと、スレッドは画面の後ろに何かをしてログを記録します。 スレッドがジョブを実行している間、LogはJtextAreaに更新されます。 チュートリアルでは基本的なことしかわかりません。だから私はそれをどうするか考えていない。 読んでいただきありがとうございます。マルチスレッド:jframeにスレッドのログを更新させる方法は?

私のスレッドクラス:

public class myThread implements Runnable{ 
    private Thread t; 

public String getThreadName() { 
    return ThreadName; 
} 

public void setThreadName(String ThreadName) { 
    this.ThreadName = ThreadName; 
} 

public void setIsDone(boolean isRunning) { 
    this.isDone = isDone; 
} 

public boolean getIsDone() { 
    return this.isDone; 
} 

private String Log; 

public String getLog() { 
    return Log; 
} 

public void setLog(String Log) { 
    this.Log = Log; 
} 

private String ThreadName; 

public boolean isDone=false; 

public myThread(String strThreadName) 
{ 
    this.ThreadName=strThreadName; 
    this.isDone=false; 
} 

@Override 
public void run() { 

    creatingFolerCreating(); 
} 

private void createingFolerCreating() 
{ 
    String strResultFolder=this.Path+"\\"+"Result"; 
    this.strAFolder=strResultFolder+"\\"+"A"; 
    this.strBFolder=strResultFolder+"\\"+"B"; 
    boolean s=false; 
    s=(new File(strResultFolder)).mkdir();if(!s)this.Log+="result Foleder is existed"; 
    s =(new File(strAFolder)).mkdir();if(!s)this.Log+="A Foleder is existed"; 
    s =(new File(strBFolder)).mkdir();if(!s)this.Log+="B Foleder is existed";  
} 


public void start() 
    { 
     if(t==null) 
     { 
      t=new Thread(this,this.ThreadName); 
      t.start(); 
      this.isDone=true; 
     } 
    } 
} 

答えて

0

私は少し例を作った、私はこれはあなたを助けることを願っています。

public class Test { 

    private JFrame frame; 
    JTextArea textArea; 
    Thread t, t1; 
    MyRunnable runner, runner1; 

    public static void main(String[] args) { 
     Test test = new Test(); 
    } 

    public Test() { 
     frame = new JFrame("Test"); 
     frame.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent event) { 
       frame.setVisible(false); 
       runner.stop(); runner1.stop(); 
       t.interrupt();t1.interrupt(); 
       frame.removeWindowListener(this); 
       frame.dispose(); 
       frame = null; 
      } 
     }); 
     Container pane = frame.getContentPane(); 
     pane.setLayout(new FlowLayout()); 
     textArea = new JTextArea(); 
     textArea.setName("textArea1"); 
     pane.add(textArea); 
     frame.setSize(400, 300); 
     frame.setVisible(true); 

     startTask(); 
    } 

    void startTask() { 
     runner = new MyRunnable("Label Text 1", 2000L); 
     t = new Thread(runner); 
     t.start(); 
     runner1 = new MyRunnable("Label Text 2", 3000L); 
     t1 = new Thread(runner1); 
     t1.start(); 
    } 

    class MyRunnable implements Runnable { 

     private String name; 
     private Long waitTime; 
     private Boolean active; 

     public MyRunnable(String tn, Long time) { 
      name = tn; 
      waitTime = time; 
      active = Boolean.TRUE; 
     } 

     public void stop(){ 
      active = Boolean.FALSE; 
     } 

     public void run() { 
      while (active) { 
       try { 
        Thread.sleep(waitTime); 
       } catch (InterruptedException ex) { 
       } 
       textArea.append(name + "\n"); 
       System.out.println(name); 
      } 
     } 
    } 

} 
+0

マルチスレッドの初心者のために申し訳ありません。しかし、Rannableクラスでは、どのようにtextAreaを呼び出すか??? textArea(JFrame)とスレッドを接続するものは何もありません。私を助けてくれてありがとう。 – Hanata

+0

とにかく私を助けてくれてありがとう。私はあなたの事例から多くのアイデアを得ました。どうもありがとうございます。 myRunnableクラスのコンストラクタでは、textAreaを渡しました。どうもありがとうございます。 – Hanata

+0

私は遅い答えのために私を許してください。 あなたの質問については、ちょっと混乱しているかもしれませんが、本当に簡単です。クラスがアプリケーションを表す別のクラスの中にあるのがわかります。それはコンテナクラスのローカルなので、Runnableクラスがそのコンテナクラスのメンバーを見ることができる理由です。希望このヘルプ –

関連する問題