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( Event Dispatch Thread ) の原因をブロックしないようにします。

あなたが知っているように、GUIの更新doInBackground()が反映されるかどうかはわかりません。それは別のスレッドで実行されます。確実にできるように

1) 通話を折り返しますSwingUtilities.invokeLater(..)

2)publish(..)ここで使用および更新します。

ただし、このタスクにはSwing Timerを使用することをお勧めします

于 2013-08-23T17:32:32.187 に答える
2

を使用してこれを行うことができるかもしれませんが、 で実行するか、スイング関数Timerを実行する必要があります。setTextEvent 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 に答える