标签的文本在Java中没有变化

时间:2012-11-08 06:57:35

标签: java swing concurrency jlabel event-dispatch-thread

我为我的项目创建了一个UI,它涉及JLabel(javax.swing),它需要在每次完成任务时更新(Label)文本。

我使用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)
 {
  .
  .
 }

}

这是代码,想象一下我需要在Source A和B中放置相同的命令。内部的Thread无效。

2 个答案:

答案 0 :(得分:5)

  

..需要在每次完成任务时更新(标签的)文本。

  • 您遇到了Concurency in Swing

  • 的问题
  • Swing GUI的所有更新必须在EDT上完成,即使Whatever.setText()被声明为线程安全,但默认情况下Thread.sleep(int)使用Swing Listener冻结Swing GUI和任何更改都不会在屏幕上更新

  • hack将taskLabel.setText(msg);放入invokeLater(),然后输出到Swing GUI应该在EDT上完成

  • 查看并使用SwingWorker作为正确的方法之一,方法processpublishdone通知EDT

答案 1 :(得分:0)

将文本添加到JLabel之后,您应该将其添加到面板中。 label.setText("东西&#34); panel.add(标签)