2011-10-23 5 views
0

表示されているタブを更新しようとしていますが、メソッドが終了するまで待ってから更新するようです。タブがすぐに更新表示されるようにする方法はありますか?またします。この理由は、この方法は、イベントディスパッチスレッドで実行されていることである選択したタブの更新(java swing)をプッシュするにはどうすればよいですか?

private static void someButtonMethod() 
{ 
    Button = new JButton("My Button"); 
    Button(new ActionListener() { 
     public void actionPerformed(ActionEvent e) 
     { 
      tabs.setSelectedIndex(1); 

      // Do some other things (In my case run a program that takes several seconds to run). 
      runProgram(); 
     } 
    }); 
} 
+0

私たちに「メソッドの終わり」という意味を見てみましょう。 –

+0

私の例が追加されました。 –

+0

実行したプログラムの終了後にタブが選択されますか? –

答えて

6

、および任意の再描画操作が:ここ

は、私はこの問題を抱えているコードの例です。このスレッドで発生します。 1つの「解決策」は、タブ索引を更新し、後でEDTで呼び出される残りの作業をスケジュールすることです。これにより、タブ状態が直ちに更新されるはずです。例えば

// Typed using Void because runProgram() has no return value. 
new SwingWorker<Void, Void>() { 
    protectedVoid doInBackground() { 
    runProgram(); 
    return null; // runProgram() doesn't return anything so return null. 
    } 

    protected void done() { 
    // Called on the EDT when the background computation has completed. 
    // Could insert code to update UI here. 
    } 
}.execute() 

は、しかし、私は感じる:次のようになりますあなたのrunProgramメソッドを呼び出すためにSwingWorkerを起動する方法の例以下のコメントパー

public void actionPerformed(ActionEvent evt) { 
    tab.setSelectedIndex(1); 

    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     // Do remaining work. 
    } 
    }); 
} 

EDIT

ここではもっと大きな問題があります。タブの更新が大幅に遅れているという事実は、あなたがEDTで長時間計算を行っていると思います。この場合、バックグラウンドスレッドでこの作業を実行することを検討する必要があります。 SwingWorkerクラスを見てください。

+0

あなたの助けてくれてありがとう。私はあなたが提供したクラスを見てきましたが、私は自分のプログラムでそれをどのように活用できるかを理解するのが難しいです。これについてアドバイスできますか? –

+0

どのように正確に問題がありますか?上記のSwingWorkerクラスまたはコードスニペットを参照していますか? – Adamski

+0

SwingWorkerクラスです。基本的には、バックグラウンドスレッドで 'runProgram()'メソッドを実行したいのですが、提供されたサンプルを調べた後、これを実現する方法を理解できません。 –

関連する問題