2011-10-23 26 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

這樣做的原因是在事件調度線程正在執行的方法,任何重繪操作也將發生在這個線程。一個「解決方案」是更新標籤索引,然後安排稍後在EDT上調用剩餘的工作;這應該會導致標籤狀態立即更新;例如

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

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

編輯

每下面如何調用SwingWorker爲了調用你的runProgram方法將看起來像這樣的例子您的評論:

// 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() 

但是,我感覺到這是一個更大的問題:事實上,您看到更新標籤時出現明顯延遲,這讓我認爲您正在EDT上執行長時間運行的計算。如果是這種情況,您應該考慮在後臺線程上執行此項工作。看看SwingWorker課程。

+0

感謝您的幫助。我一直在看你提供的課程,但是我很難理解如何在我的程序中使用它。請你能提供這方面的建議嗎? –

+0

你到底有什麼困難?你是指SwingWorker類還是上面的代碼片段? – Adamski

+0

SwingWorker類。本質上我想在後臺線程中運行'runProgram()'方法,但是在檢查提供的示例之後,我無法理解如何實現這一點。 –

相關問題