我有一個SwingWorker,它在後臺讀取並處理文件,之後它在JTextPane中使用各種樣式格式化和顯示數據。Swingworker.done()在完成後將GUI凍結幾秒
如果文件很大(超過200K),我將顯示一個包含進度條的對話框。在SwingWorker的done()方法中,填充JTextPane,然後隱藏對話框。完成()方法是這樣的:
protected void done() {
populateTextPane();
hideProgressDialog();
System.out.println("After hideProgressDialog");
}
當它運行時,我會看到對話框消失,在控制檯中的println消息,但隨後的GUI凍結另外大約10-15秒,用數據在凍結結束時在JTextPane中可見。
我認爲done()方法中發生的任何事情都會發生在Event Dispatch Thread中。但顯然JVM正在產生另一個線程來隱藏對話框並在填充JTextPane時執行println。我想保持顯示進度對話框,直到GUI準備好再次接受用戶輸入爲止......如何檢測done()中的所有內容何時完成?
的數據是一個很大的層次結構,以及它將如何看是不是真的知道,直到整個背景處理完成。它不適合以線性順序零散發布。但是,也許我可以通過在處理完數據後在後臺線程中構建StyledDocument來獲得某些東西,然後將完成的文檔分配給EDT中的JTextPane,而不是在EDT中的文檔已經駐留在JTextPane中時直接更新文檔。 – Gigatron 2013-03-25 14:51:35
如果'populateTextPane'長時間運行,爲什麼'System.out'調用會被執行並且UI會在之後凍結? – Robin 2013-03-25 15:53:16
@Robin - 沒有來自OP的進一步細節,你的猜測(某事得到安排)與其他任何方式一樣有效:-) – kleopatra 2013-03-25 16:00:35