JAVA2d用于,创建用于翻转效果的 Java2D 合成
【IT168 技術文章】
引言
許多應用程序都有包含圖標的按鈕,當按鈕被選中或者鼠標移到按鈕上時,按鈕的圖標會發生改變。Web 瀏覽器(如 Microsoft Internet Explorer)中的工具欄按鈕就是這種現象的一個示例,其中的按鈕圖形是灰色的,當鼠標移動到按鈕上時,圖形會變成有顏色的。為了實現這種效果,要創建兩組圖形;一組用于正常狀態,一組用于當鼠標移動到按鈕上時的活動狀態。然而,對于設計者來說,創建兩組圖形很費時間,并且意味著在需要更改圖形時,必須對這兩組圖形做雙倍的維護工作。更優化的辦法是只使用一個圖標,而圖形效果則通過編程來實現,從而避免創建和維護一個單獨圖標的開銷。本文描述的問題是針對如 圖 1所示的向導頁中的一組按鈕的,當用戶在每個按鈕上懸停時,圖形會發生改變以向用戶表示該按鈕是活動的。
圖 1.Web Module 按鈕在鼠標移動到它上面時處于活動狀態并且圖形已經改變。
在本文中,我們將說明如何通過使用 Java2D API 創建一個能夠接受圖像并創建所期望的效果的類來實現上述效果。這需要我們理解如何構造圖像以及如何使用 AWT composite 來操作這些圖像。
背景知識
javax.swing.JButton 類有一個布爾屬性 rolloverEnabled 和一個 rolloverIcon 屬性,后者的類型是 javax.swing.Icon。如果 rolloverEnabled 為 true,則當鼠標移動到按鈕上時,rolloverIcon 的值就被用到該按鈕的圖形上。我們認定,一個優秀的解決方案應該有一個新的稱為 RolloverImageIcon 的類,我們將在其構造函數中給它提供一張圖像,然后,這個類會在繪制圖標之前對圖標進行操作。
這樣,用于創建 rolloverButton 的代碼將如下所示:
1 JButton button=newJButton(regularIcon);2 button.setRolloverEnabled(true);3 button.setRolloverIcon(newRolloverIcon(regularIcon));4
下一步是創建能夠將初始圖標包裝起來并用 圖 1所示的圖形效果給圖標著色的 RolloverIcon 類。
RolloverIcon
RolloverIcon 類將實現 javax.swing.Icon 接口,這個接口允許按鈕的 rolloverIcon 屬性取有效值并將初始圖標存儲到名為 fIcon 的實例變量中:
public class RolloverIcon implements Icon { protected Icon fIcon; {
一種變通的解決方案可能是創建 JButton 的子類,并將翻轉效果封裝到這個子類中,不過,通過將邏輯放到 RolloverIcon 類中,圖形效果也可以在其它情形(如復選框或菜單項)中使用。假設想得到定制的子類,那么使用創建圖形效果的邏輯并將這個邏輯委托給 RolloverIcon 的實例是個很簡單的做法。
javax.swing.Icon 接口有三個方法: getIconWidth()、getIconHeight() 和 paintIcon(Component,Graphics,x,y) 。前兩個方法可以委托給 RolloverIcon 正在為它創建圖形效果的圖標,因為翻轉圖像的大小將與原來圖像的相同。
1 publicintgetIconHeight() {2 returnfIcon.getIconHeight();3 }4 publicintgetIconWidth() {5 returnfIcon.getIconWidth();6 }7
繪制(paint)方法是將對圖形上下文進行實際繪圖的方法。Component 參數代表正在為之繪制圖標的控件,如 javax.swing.JButton 的實例。這個方法允許我們訪問諸如控件的字體、插圖等細節問題,以及我們在繪制圖標時可能想考慮的其它屬性。x 和 y 參數是在繪圖表面上正在對該圖形進行著色的位置。這些位置是繪圖表面的絕對位置,與從組件的 getLocation() 返回的值不同,后者是按鈕相對于其父容器的位置。繪圖 API 需要使用絕對值,以便將它們傳遞到 paintIcon 方法中,避免不得不遍歷組件的所有父容器來計算這些值。
graphics 參數是代表繪圖表面的對象。雖然它的類型是 java.awt.Graphics,但它將是 java.awt.Graphics2D 的實例。Graphics2D 抽象類是 Java2D API 的一部分,它是出于向后兼容的目的作為 Java2 平臺的一部分引入的,繪制方法的參數沒有被重新轉換為 Graphics2D 類型,盡管只要使用的 JRE 是 Java2 或更高版本就可以保證這個參數是 java.awt.Graphics2D 的實例。
paintIcon 方法的完全說明如下所示:
public void paintIcon(Component c, Graphics g, int x, int y);
RolloverIcon 實例將包裝我們希望用 圖 1中所示的圖形效果繪制的初始圖標。我們可以使用 Graphics2D 對象的 composite 屬性做到這一點。composite 屬性的類型是 java.awt.Composite 接口,并且由 Graphics2D 對象完成的對圖形表面的所有圖元繪圖都直接通過對象的 composite 進行。存在許多現成的合成類,如其中有一個是用于創建異或(XOR)效果的。XORComposite 是 sun.java2d.loops.XORComposite 類,它的構造函數以要著色成異或效果的繪圖的顏色為參數。每種顏色由紅、綠和藍值組成,如果用黑色(黑色的 r、g、b 值為 0、0、0)對顏色進行異或,則該顏色將被反轉。要看到這種效果,繪制方法可以編寫成如下所示:
1 publicvoidpaintIcon(Component c, Graphics g,intx,inty) {2 Graphics2D g2D=(Graphics2D)g;3 Composite oldComposite=g2D.getComposite();4 g2D.setComposite(newsun.java2d.loops.XORComposite(Color.black));5 fIcon.paintIcon(c,g,x,y);6 g2D.setComposite(oldComposite);7 }8
要對初始圖標(保存在實例變量 fIcon 中)進行著色,我們只要遵從它的 paintIcon(Component,Graphics,int,int) 方法(這個方法已經將圖形的 composite 預先設置為 XORComposite 對象)就行了。在操作圖形對象的屬性時,在完成之后將這些屬性恢復成原來的值是一種很好的做法。在上面的方法中顯示了這一點,我們在修改 composite 之前先將原來的 composite 存儲起來,然后在完成修改之后將它恢復。如果您沒有這樣做,則 XORComposite 將會被保留在圖形對象中,并且會影響到隨后的所有繪圖操作。
圖 2顯示了 XORComposite 的效果。上面那行按鈕是 RolloverIcon 被設置成 rolloverIcon 屬性的原來的按鈕。下面那行按鈕是被永久性地設置的,用來顯示被設置成 icon 屬性的 RolloverIcon 的結果。XORComposite 接受圖標并通過用 0 對圖標的每個像素進行異或來轉換它。
圖 2. XORComposite 可以用來控制如何對圖標進行著色
異或的效果雖然不是如 圖 1 所示的結果,但它確實表明了 composite 是如何負責在圖標的繪圖表面上進行著色的。如果我們創建自己的能讓我們訪問圖標的精確著色的合成類,那我們就應該能夠實現我們所期望的翻轉效果。我們的類將叫做 RolloverComposite ,并且 paintIcon 方法可以在對初始圖標進行著色之前將所期望的效果在圖形對象中進行設置。
在實現 RolloverComposite 類之前,我們需要了解關于在 Java 語言中如何表示顏色以及如何將這些顏色繪制到繪圖表面上去的更多知識。
總結
以上是生活随笔為你收集整理的JAVA2d用于,创建用于翻转效果的 Java2D 合成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装JESS插件到Eclipse Mar
- 下一篇: 论文阅读 | NIPS‘20 | Bet