1

プロジェクトの UI を作成しています。これには、そのタスクが完了するたびに (ラベルの) テキストを更新する必要がある JLabel (javax.swing) が含まれます。

label.setText を使用して内部のテキストを変更/更新します (以下に示すように)。ただし、ほとんどの場合、ラベルはテキストを変更しません。問題が解決することを期待して label.UpdateUI() を使用しようとしましたが、そうではありません。

taskLabel.setText(msg);

何か案は?

if (gatherSamplesValue)
{
      if (SourceACheckBox)
      {
           try 
           { 
                Thread setLabelText1 = new Thread(){
                    public void run(){
                        taskLabel.setText(msg);

                    taskLabel.validate();
                }
             };
             msg = "Task : Gathering URLs from Phish Tank. DateTime: " + Main.getCurrentDate();
             setLabelText1.start();
             SourceA.sourceAMain();
             msg="Done with the task : " + Main.getCurrentDate();
             Thread setLabelText2 = new Thread(){
                public void run(){
                    taskLabel.setText(msg);
                    taskLabel.validate();
                }
             };
             setLabelText2.start();
      } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
      }
 }

 if (SourceBCheckBox)
 {
  .
  .
 }

 if (SourceCCheckBox)
 {
  .
  .
 }

}

これがコードです。ソース A と B 内に同じコマンドを配置する必要があると想像してください。その中のスレッドは機能していません。

4

2 に答える 2

5

..そのタスクが完了するたびに (ラベルの) テキストを更新する必要があります。

  • Swingの同時実行性に問題がある

  • Swing GUI へのすべての更新は EDT で行う必要がありWhatever.setText()、スレッドセーフとして宣言されていても、デフォルトでThread.sleep(int)fromSwing Listenerを使用すると Swing GUI がフリーズし、変更が画面上で更新されない

  • hack を に入れ taskLabel.setText(msg);invokeLater()EDT で Swing GUI に出力する必要があります。

  • 適切な方法の 1 つとして参照および使用するSwingWorker方法、場所processpublishおよびdone通知された EDT

于 2012-11-08T07:34:28.057 に答える
0

テキストをJLabelに追加したら、次のようにパネルに追加する必要があります。label.setText( "something"); panel.add(label)

于 2012-11-08T07:04:36.100 に答える