0

我正在让 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”并且它没有改变。如果可能,请建议一种替代方法...

4

2 回答 2

3

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

我不确定更新您的 guidoInBackground()是否会如您所知反映,它在另一个线程中运行。以确保您可以

1) 将您的电话转入SwingUtilities.invokeLater(..)

2)publish(..)在这里使用和更新。

但我建议使用此任务Swing Timer

于 2013-08-23T17:32:32.187 回答
2

也许您可以使用 aTimer来执行此操作,但您需要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);
        }
      }
    }
于 2013-08-23T17:31:55.550 回答