即使使用SwingWorker,jLabel的setText也无法正常工作

时间:2013-08-23 17:05:46

标签: java swing swingworker

我正在使JLabel显示一个计时器,所以它每秒都在更新,我在一个线程的帮助下更新它,我正在使用SwingWorker来更新JLabel,但它无法正常工作。 这是我的代码......

long pos=-1;
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

     try
    {
        pos=...value of timer....
        jLabel1.setText("in function");
        jLabel3.setText("in function");
        timer=new Thread(new adsa());
        timer.start();

    }
    catch(Exception e)
    {    
        System.out.println("EXCEPTION CAUGHT");
    }
}                                        

/**
 *
 */
public void run()
{

    try
    {

        System.out.println(pos);

    while(pos!=0 && clip.isRunning())
    {
        label1.setText(String.valueOf(pos));
        System.out.println(pos);
        pos--;
        timer.sleep(1000);

        SwingWorker worker = new SwingWorker() {

            @Override
            public Object doInBackground(){

                try
                {
                jLabel3.setText(String.valueOf(pos));
                jLabel3.setText("ghfdxhc");
                label1.setText("hvgjh");
                System.out.println("zxc");

                return null;
                }
                catch(Exception e)
                {
                    return null;
                }

            }
        };
        worker.execute();
      }

    }
    catch(Exception e)
    {
        System.out.println("Error in run");
    }
}

所有println语句都正常工作,即使是在SwingWorker内部,但jLabel没有更新,“in function”会在两个标签上显示,而且不会改变。 如果可能,请建议另一种方法......

2 个答案:

答案 0 :(得分:3)

对于这类工作,您应该使用Swing Timer。 SwingWorker通常用于繁重的任务,并且不会阻止gui(Event Dispatch Thread)导致在不同线程中运行。

我不确定在doInBackground()中更新您的gui是否会反映出来,如果您知道,它会在另一个线程中运行。确保你可以

1)在SwingUtilities.invokeLater(..)

中打电话

2)使用publish(..)并在此处更新。

但我建议用于此任务 Swing Timer

答案 1 :(得分:2)

也许您可以使用Timer来执行此操作,但您需要在setText中运行Event dispatch thread或任何回转功能。

如果你想使用SwingWorker,你需要在EDT中调用swing函数。 你可以尝试这样的事情:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            pos=...value of timer....
            jLabel1.setText("in function");
            jLabel3.setText("in function");
            Ctimer timer = new CTimer(pos, jLabel1, jLabel2, jLabel3);
            timer.execute();

    } 

    class CTimer extends SwingWorker<Void, Long> {

      private long pos;
      private JLabel jLabel1, jLabel2, jLabel3;

      public CTimer(long pos, JLabel jLabel1, JLabel jLabel2, JLabel jLabel3) {
        this.pos = pos;
        this.jLabel1 = jLabel1;
        this.jLabel2 = jLabel2;
        this.jLabel3 = jLabel3;
      }

      @Override
      protected Void doInBackground() throws Exception {
        while (pos != 0 && clip.isRunning()) {
          publish(pos);
          pos--;
          Thread.sleep(1000);
        }
      }

      @Override
      protected void process(List<Long> times) {
        for (Long time : times) {
          jLabel1.setText("xyz");
          jLabel2.setText("ababa");
          jLabel3.setText("" + time);
        }
      }
    }