摘要:AWT是Abstract Windowing Toolkit的縮寫,包含Java語言建立和設(shè)置圖形用戶界面的基本工具,是基礎(chǔ)類的一部分。JDK 7.0即將發(fā)布,這個版本中AWT正式支持半透明窗體。文章介紹了不同層面上的半透明效果,給出使用方法和條件,并從源代碼的角度分析實(shí)現(xiàn)機(jī)制,為開發(fā)、測試和維護(hù)提供依據(jù)。
關(guān)鍵詞:AWT 窗體 半透明 像素級
在JDK 6 update 10 build 12中,Java語言引入了com.sun.awt.AWTUtilities類,可以實(shí)現(xiàn)半透明窗體效果,但在實(shí)際開發(fā)中并不推薦使用,原因是該類沒有出現(xiàn)在JDK的主要版本中,只是一種附加的臨時方案,獨(dú)立于AWT存在。在即將發(fā)布的JDK 7.0中,該類被移除,取而代之的是AWT中出現(xiàn)的一些新方法,用于正式支持半透明窗體,可以實(shí)現(xiàn)整體、背景和像素層面上的半透明效果。為敘述方便,文中java.awt包中的類名采用簡稱,其余類名采用規(guī)范化名稱。
1 整體半透明
在AWT中,F(xiàn)rame類和Dialog類是首選的頂層窗口,帶有標(biāo)題和邊框,易于使用,前者可以生成普通窗口,后者可以生成各種類型的對話框。在JDK 7.0中,它們可以實(shí)現(xiàn)半透明效果,請參考以下代碼,同樣適用于Dialog類。
Frame f=new Frame();
f.setOpacity(0.5f);
以上代碼中setOpacity方法設(shè)置整個窗口的不透明度為0.5,窗口上的邊框、標(biāo)題欄和子元素的效果也受到影響。該方法實(shí)際上在父類Window中實(shí)現(xiàn),內(nèi)部使用synchronized關(guān)鍵字同步,是線程安全的,簽名如下:public void setOpacity(float opacity)
參數(shù)opacity(不透明度)是單精度浮點(diǎn)類型,在區(qū)間[0,1]上,如果超出范圍,會拋出java.lang.IllegalArgumentException異常。Window處于全屏狀態(tài)時不支持半透明,會導(dǎo)致IllegalComponentStateException異常,可根據(jù)GraphicsDevice類的getFullScreenWindow方法返回值判斷Window狀態(tài);底層系統(tǒng)不支持半透明則拋出java.lang.UnsupportedOperationException異常,可使用以下代碼判斷應(yīng)用環(huán)境是否滿足半透明需要:
GraphicsConfiguration gc=f.getGraphicsConfiguration();
GraphicsDevice gd=gc.getDevice();
if(gc.getDevice().getFullScreenWindow() == this) {
//當(dāng)前窗體處于全屏狀態(tài)
}
if(!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)){
//底層系統(tǒng)不支持半透明
}
2 背景半透明
Component類具有圖形表示能力,可以在屏幕上顯示,與用戶交互,它的setBackground方法可以設(shè)置組件的背景色。Window類是Component類的后代,提供了新的setBackground方法方法支持半透明,部分內(nèi)容摘抄如下:
public void setBackground(Color bgColor){
//此處省略從新舊兩個背景色中提取alpha分量
if((oldAlpha==255)(alpha<255)){
setLayersOpaque(this,1);
}else if((oldAlpha<255)(alpha==255)){
setLayersOpaque(this,true);
}
}
參數(shù)bgColor表示顏色,內(nèi)部封裝了紅、綠、藍(lán)和alpha共四個分量,新的setBackground方法在調(diào)用舊方法后,根據(jù)前后兩個背景色中的alpha分量判斷是否使用不透明。如果原背景色不透明(alpha分量等于255)而新背景色透明(alpha分量小于255),則關(guān)閉不透明;反之則啟用不透明以提高性能。與整體半透明類似,該方法在全屏或底層系統(tǒng)不支持的情況下也會拋出異常;該方法還需要像素級半透明支持,如果底層系統(tǒng)不支持則拋出java.lang.UnsupportedOperationException異常,可使用以下代碼判斷是否支持像素級半透明:GraphicsConfiguration gc=f.getGraphicsConfiguration();
GraphicsDevice gd=gc.getDevice();
if(gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT)){
//不支持像素級半透明,不能使用背景半透明
}
3 像素級半透明
Graphics類是所有圖形上下文的抽象基類,允許應(yīng)用程序在組件以及閉屏圖像上進(jìn)行繪制,它的setColor方法可以設(shè)置繪制時使用的顏色。在JDK 7.0中,可以通過Graphics實(shí)例在組件上繪制各種形狀的圖形甚至單個像素點(diǎn),支持半透明。參考以下代碼,在Frame上填充半透明的矩形區(qū)域。
Frame f=new Frame(){
public void paint(Graphics g){
g.setColor(new Color(255,0,0,127));
g.fillRect(0,0,100,100);
}
};
f.setBackground(new Color(0,0,0,0));
代碼中最后一行設(shè)置窗體的背景色完全透明,是為了能夠看到矩形區(qū)域的半透明效果。像素級半透明的使用條件與背景半透明相同。
4 結(jié)語
在JDK 7.0中,AWT的功能得到了拓展,雖然開發(fā)圖形界面應(yīng)用程序一直是Java語言的弱項(xiàng),但是隨著JDK的進(jìn)步,這一不足正在得到改善。作為開發(fā)人員,必須時刻了解語言和開發(fā)工具的最新動態(tài),持續(xù)提高自身的業(yè)務(wù)能力。
參考文獻(xiàn):
[1]馬朝暉,陳美紅.Java語言導(dǎo)學(xué)[M].北京:機(jī)械工業(yè)出版社.2003,1.
[2]陳昊鵬.Java編程思想.北京:機(jī)械工業(yè)出版社[M].2007,6.