2 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
很多問題:
不要擴(kuò)展Applet。小程序死了。對(duì)于自定義繪畫,您只需擴(kuò)展
JPanel
面板并將其添加到框架中即可。您將
paintComponent()
在 JPanel 中覆蓋,而不是在paint() 中進(jìn)行覆蓋。繪畫方法僅用于繪畫,您不應(yīng)該:
讀取方法中的圖像。繪畫方法被多次調(diào)用。您希望繪畫速度快,不應(yīng)該進(jìn)行 I/O。讀取類的構(gòu)造函數(shù)中的圖像
正在創(chuàng)建線程。同樣,由于無法控制多次調(diào)用繪畫方法,因此您不想繼續(xù)創(chuàng)建線程。如果您想要某種動(dòng)畫,那么您應(yīng)該使用 Swing Timer。
我建議您閱讀有關(guān)自定義繪畫的 Swing 教程中的部分。它包含的工作示例將向您展示如何更好地構(gòu)建代碼。
還有一個(gè)關(guān)于 的部分How to Use Swing Timers
。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果我們?cè)?Java 中談?wù)搱D形,我們只有一個(gè)線程負(fù)責(zé) EDT([1][事件調(diào)度線程])。換句話說,無論您想對(duì)視圖做什么,都將由 EDT 處理并且必須由 EDT 處理,是的,您的視圖也包含所有挫折、框架...
但請(qǐng)注意,它只是一個(gè)線程,當(dāng)這個(gè)線程忙于做一些計(jì)算時(shí),無法對(duì)用戶事件做出反應(yīng),因此您的視圖將凍結(jié)。您可以在另一個(gè)線程中做的是準(zhǔn)備數(shù)據(jù)(在您的情況下讀取文件圖像)
要在 EDT 中工作,您可以使用 SwingInvoker.invokelater() 或使用 swingutilities.isEventDispatchThread() 檢查您是否已經(jīng)在 EDT
[1] https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html
添加回答
舉報(bào)