2012-02-10 51 views
3

當按下JButton時,My Swing應用程序將文本行打印到JScrollPane內部的JTextPane。快速操作沒有問題。但是,一些JButton會調用可能需要幾分鐘的操作。在此期間,按鈕保持灰色。JTextPane活躍

目前發生的情況是,文本是「批處理」,然後在操作結束時我同時得到數百行文本,同時按鈕變得非灰色。問題是,我希望文本被附加到JTextPane中顯示的文檔上,以便在整個操作完成時更早出現(在附加時)。這將創造更好的用戶體驗。

我在做什麼錯?

+1

你是在UI線程中執行非UI相關的計算。它可以使用'SwingWorker'修復,如Oracle教程中所解釋的:http://java.sun.com/developer/technicalArticles/javase/swingworker/ – 2012-02-10 08:02:21

回答

2

使用SwingWorker來執行後臺操作。

// Your button handler 
public void actionPerformed(ActionEvent e) { 
    (new SwingWorker<Void, String>() { 
    public Void doInBackground() { 
     // perform your operation 
     // invoke publish("your string"); 
    } 

    protected void process(List<String> chunks) { 
     // append your string to the scroll pane 
    } 
    }).execute(); 
} 
1

您正在從阻止每個事件的AWT線程中直接調用代碼。解決方法是將您的長期運行代碼放在單獨的Thread中。隨着您的代碼被執行並獲得結果,您將通知您(使用觀察者/可觀察模式)的視圖。當您的視圖被通知時,您將更新滾動窗格內容。

您還必須驗證您是否在AWT線程中運行(SwingUtilities.isEventDispatchThread())。如果您不是,那麼您需要使用SwingUtilities.invokeLater()在AWT線程中發送視圖的更新,因爲Swing不是線程安全的。