2017-06-19 156 views
0

Swing的新手,但不是Java。我正在嘗試以下操作:基本的Java Swing JFrame重新繪製

public void actionPerformed(ActionEvent e) { 

methodA(); 
pane.repaint(); 
methodB(); 
pane.repaint(); 

} 

where methodB()需要很長時間。我希望它畫兩次,但第一次的油漆電話從來沒有發生過。這就像我做的那樣:

public void actionPerformed(ActionEvent e) { 

methodA(); 
methodB(); 
pane.repaint(); 

} 

對不起,如果這是基本的,但我試過搜索,我仍然不明白爲什麼。

我已經嘗試直接調用paint,除了應用程序在每次重繪時閃爍之外都按預期工作。

+2

不同的場景,不同的調用,但相同的行爲和相同的解決方案:[Java swing GUI凍結](https://stackoverflow.com/questions/11185485/java-swing-gui-freezes) – BackSlash

+0

'repaint()'是繪製組件_soon_的請求(不是立即)。但是,如果'methodB'需要很長時間,它將阻塞事件分派線程,並且在完成之前沒有任何內容會被重新繪製。考慮在另一個線程中運行'methodB'。 – khelwood

回答

4

actionPerformed在事件調度線程(EDT)中被調用,該事件調度線程也是執行繪製的地方,repaint只標記要重新繪製的組件。這意味着繪畫只能在actinPerformed完成執行後才能完成。

長時間運行的任務不應該在EDT中執行,請使用SwingWorker或其他線程。

指示研究Swing's Threading Policy