2015-04-24 45 views
1

我有一個JPanel,上面有一些JButton。當JButton被點擊時,調用一個事件處理程序。在這個事件處理程序中,我希望能夠多次重繪JPanel。這個事件處理程序在幾秒鐘內發生了很多處理,我需要能夠更新JPanel以向用戶顯示增量更新。但是,當我在事件處理程序內的JPanel上調用repaint()時,似乎沒有任何事情發生。 JPanel等待重繪,直到事件處理程序返回。從EDT重繪JPanel多次

我試過使用repaint(long tm)方法,但這似乎沒有幫助。如何從EDT內多次重新繪製JPanel的這種期望行爲?

回答

5

Swing是單線程的,所以事件處理程序和繪畫出現在單個線程(EDT)上。如果您在EDT上進行計算需要花費時間並嘗試這樣做,則不能執行重新繪製(或其他任何操作)。要解決這個問題,請在單獨的Thread上執行長時間運行任務或使用SwingWorker

3

由於大多數類似的問題答案都會告訴您 - 使用SwingWorker來執行長時間運行的任務。通過SwingWorker的發佈/處理方法將更新推送到GUI,當更新傳遞到GUI時,重新繪製它。這樣你可以避免在Swing事件線程上跺腳,並避免凍結你的程序。請查看Concurrency in Swing。也看看我的代碼this answer to a similar question