2016-04-05 3 views
1

スタートボタンを押したときに開始するスレッドがあります。私がしたいのは、私のスレッドが変更を加える情報を含むように、ラベルを再描画することです。私が直面している唯一の問題は、スレッドが実行された後にのみjLabelが再描画することです。スレッドが実行されている間に誰かがどのように再描画できるかについて誰かに懇願してくれますか?ありがとう。ここでスレッドの実行中にスイングコンポーネントを再描画

は、私のコードの抜粋です:

Store m = new Store(); //Store extends Thread 
private void startActionPerformed(java.awt.event.ActionEvent evt) {  
    .... 
    //I get the simulation time of the store from a textbox 
    //the thread runs for this number of seconds 
    //when it is done, the store is closed(the open variable is set to false) 
    .... 

    m.start(); 

    while (m.isOpen()) { 
     queue0.setText(String.valueOf(m.clientiCasai(0))); 
     //here I will have more queues 
     .... 
     noOfClients.repaint(); //this is the label that should show the number of clients in queue 0 
    } 
} 
+0

EDTのwhileループを実行しないでください。ただし、スレッドが 'noOfClients.setText(何でも)'を呼び出すと、すでに発生しているはずの再描画イベントがスレッドによってトリガーされます。 – Thomas

+3

スイングスレッドをブロックしないでください。再ペインティングは、アクションメソッドの実行後にのみ呼び出されます。 'repaint()'は再描画を行いませんが、後でコンポーネントを再描画する必要があることを通知します。 [SwingのConcurency](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/) –

+0

SwingUtilities.invokeAndWait()のsetText()をラップする – StanislavL

答えて

1

あなたstartActionPerformed()メソッドは、すべてのSwing変更操作に使用されなければならないスレッドですEventDispatchThread(EDT)上で実行するべきではありません。 EDTをブロックすると、UIは再描画されません。フリーズです。

あなたnoOfClients.repaint()呼び出しはEDT上で行われるべきでなく、queue0ラベルに新しい値を設定し、あなたの呼び出しは、EDTにする必要があります。

簡素化のため。 queue0.setText() EDTを呼び出した場合は、再描画が行われるため、削除することができます。

この

を呼び出すことによって達成することができます。

SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      queue0.setText("<text>"); 
     } 
    }); 

あなたがあなたのストアへのメソッドstartActionPerformed()を保持しているインスタンスへの参照を渡すと、必要なときにそこからそれを呼び出すことができますいずれかのあなたの問題を解決したりするにはストアの進捗状況を監視し、それをSwing EDTに伝播する別のスレッドを開始することができます。

+1

'm.start() ; 'は' startActionPerformed'から呼び出されます。言い換えれば、彼は 'startActionPerformed'でスレッドを開始するので、' startActionPerformed'がEDTで実行されます。 – Oebele

1

実際の描画はEDTのイベントループ中にも行われるという問題があります。 while()ループは基本的にEDTの進行を妨げています。 1つの可能な回避策は、ラベルを更新する世話をする追加のスレッドを用意することです。

関連する問題