淺析Swing組件的規(guī)則
Swing的規(guī)則是:
一旦Swing組件被具現(xiàn)化(realized),所有可能影響或依賴于組件狀態(tài)的代碼都應該在事件派發(fā)線程中執(zhí)行。
這個規(guī)則可能聽起來有點嚇人,但對許多簡單的程序來說,你用不著為線程問題操心。在我們深入如何撰寫Swing代碼之前,讓我們先來定義兩個術語:具現(xiàn)化(realized)和事件派發(fā)線程(event-dispatchingthread)。
具現(xiàn)化的意思是組建的paint()方法已經(jīng)或可能會被調(diào)用。一個作為頂級窗口的Swing組件當調(diào)用以下方法時將被具現(xiàn)化:setVisible(true)、show()或(可能令你驚奇)pack()。當一個窗口被具現(xiàn)化,它包含的所有組件都被具現(xiàn)化。另一個具現(xiàn)化一個組件的方法是將它放入到一個已經(jīng)具現(xiàn)化的容器中。稍后你會看到一些對組件具現(xiàn)化的例子。
事件派發(fā)線程是執(zhí)行繪制和事件處理的線程。例如,paint()和actionPerformed()方法會自動在事件派發(fā)線程中執(zhí)行。另一個將代碼放到事件派發(fā)線程中執(zhí)行的方法是使用SwingUtilities類的invokeLater()方法。
所有可能影響一個已具現(xiàn)化的Swing組件的代碼都必須在事件派發(fā)線程中執(zhí)行。但這個規(guī)則有一些例外:
◆有些方法是線程安全的:在SwingAPI的文檔中,線程安全的方法用以下文字標記:
Thismethodisthreadsafe,althoughmostSwingmethodsarenot.(這個方法是線程安全的,盡管大多數(shù)Swing方法都不是。)
◆一個應用程序的GUI常??梢栽谥骶€程中構建和顯示:下面的典型代碼是安全的,只要沒有(Swing或其他)組件被具現(xiàn)化:
- publicclassMyApplication{
- publicstaticvoidmain(String[]args){
- JFramef=newJFrame("Labels");
- //在這里將各組件
- //加入到主框架……
- f.pack();
- f.show();
- //不要再做任何GUI工作……
- }
- }
【編輯推薦】