JAVA的繪圖功能非常豐富,繪圖包括字體、顏色、圖形,以下我們將分技術專題來講。
一、關于JAVA的繪圖機制。
JAVA中的任何一個圖形組件,小到文本框、標簽,大到一個FRAME,一個DIALOG,都有一個專門負責顯示其界面的函數,這個函數名稱是固定的:paint,它的原型為:
public void paint(Graphics g)
{
……
}
每當組件大小、位置、組件內容發生變化時,該函數即負責生成新的圖形界面顯示。由于該函數可以被子類繼承,因此,繼承的子類有能力修改該函數。如果子類中沒有出現該函數,則表示其行為完全繼承自父類。則不管是組件中是否添加了新的內容,是否發生了大小的改變,是否發生了位移,父類都要有一個專門的線程,來負責描繪變化以后的組件界面。 paint函數由父類自動維護,并且如果子類一旦重載該函數,必須自己去維護所有的界面顯示。
一、關于JAVA的繪圖機制。
JAVA中的任何一個圖形組件,小到文本框、標簽,大到一個FRAME,一個DIALOG,都有一個專門負責顯示其界面的函數,這個函數名稱是固定的:paint,它的原型為:
public void paint(Graphics g)
{
……
}
每當組件大小、位置、組件內容發生變化時,該函數即負責生成新的圖形界面顯示。由于該函數可以被子類繼承,因此,繼承的子類有能力修改該函數。如果子類中沒有出現該函數,則表示其行為完全繼承自父類。則不管是組件中是否添加了新的內容,是否發生了大小的改變,是否發生了位移,父類都要有一個專門的線程,來負責描繪變化以后的組件界面。 paint函數由父類自動維護,并且如果子類一旦重載該函數,必須自己去維護所有的界面顯示。
二、設置畫筆顏色
1、顏色常識
任何顏色都是三原色組成(RGB),JAVA中支持224位彩色,即紅綠藍色分量可取值介于0..255之間。下面首先學習一個JAVA中的類Color
Color中的常量:
public final static Color black=new Color(0,0,0);
public final static Color blue=new Color(0,0,255);
…..
Color的構造函數:
public Color(int r,int g,int b);
使用舉例:如果想構造一個灰色對象,則用下面的句子:
Color gray=new Color(205,205,205);
2、設置畫筆顏色語法
g.setColor(color); //color是一個Color對象
每修改一次顏色它影響的就是下面所有的繪圖語句,一直影響到再次碰到setColor函數才以新的顏色代替。
3、使用JColorChooser組件選擇顏色
JAVA中有一個已經定義好的選色器,通過簡單的語法我們就可以將該窗口調出來,從其中選擇自己喜歡的顏色。下面的這個例子就是通過顏色選取器選取顏色,并將選擇到的顏色做為窗體的背景色。
(1)JColorChooser簡介
JColorChooser組件的showDialog()方法讓用戶從彈出的窗口中選擇一個顏色,并傳給Color對象。其調用語法如下:
color=JColorChooser.showDialog(this,”選色”,color);
第一個參數指定調用選色器的父窗體,第二個參數指定選色器窗口標題,最后一個為接收顏色的顏色對象。
4、如何將一個圖形(以文件存在,如JPG或者GIF)畫到窗體的畫布中
其實放置圖形到畫板中實際就是調用了畫板的drawImage函數。其大致思路如下:
首先獲取一個ImageIcon對象,這個對象將會從指定的文件中讀取相關圖象信息,它支持GIF和JPG、BMP等基本圖象格式。語法如下:
ImageIcon icon=new ImageIcon(GraExp5.class.getResource("1.gif"));
獲取到圖象的圖標以后,就可以從圖標中獲取到繪制到畫板上的實際需要的圖象:
Image img=icon.getImage();
有了這個圖象對象,我們就可以用畫板的drawImage函數畫圖了。
g.drawImage(img,0,0,null);
中間兩個參數是圖象繪制時在畫板的起始點坐標。
例如:
1、顏色常識
任何顏色都是三原色組成(RGB),JAVA中支持224位彩色,即紅綠藍色分量可取值介于0..255之間。下面首先學習一個JAVA中的類Color
Color中的常量:
public final static Color black=new Color(0,0,0);
public final static Color blue=new Color(0,0,255);
…..
Color的構造函數:
public Color(int r,int g,int b);
使用舉例:如果想構造一個灰色對象,則用下面的句子:
Color gray=new Color(205,205,205);
2、設置畫筆顏色語法
g.setColor(color); //color是一個Color對象
每修改一次顏色它影響的就是下面所有的繪圖語句,一直影響到再次碰到setColor函數才以新的顏色代替。
3、使用JColorChooser組件選擇顏色
JAVA中有一個已經定義好的選色器,通過簡單的語法我們就可以將該窗口調出來,從其中選擇自己喜歡的顏色。下面的這個例子就是通過顏色選取器選取顏色,并將選擇到的顏色做為窗體的背景色。
(1)JColorChooser簡介
JColorChooser組件的showDialog()方法讓用戶從彈出的窗口中選擇一個顏色,并傳給Color對象。其調用語法如下:
color=JColorChooser.showDialog(this,”選色”,color);
第一個參數指定調用選色器的父窗體,第二個參數指定選色器窗口標題,最后一個為接收顏色的顏色對象。
4、如何將一個圖形(以文件存在,如JPG或者GIF)畫到窗體的畫布中
其實放置圖形到畫板中實際就是調用了畫板的drawImage函數。其大致思路如下:
首先獲取一個ImageIcon對象,這個對象將會從指定的文件中讀取相關圖象信息,它支持GIF和JPG、BMP等基本圖象格式。語法如下:
ImageIcon icon=new ImageIcon(GraExp5.class.getResource("1.gif"));
獲取到圖象的圖標以后,就可以從圖標中獲取到繪制到畫板上的實際需要的圖象:
Image img=icon.getImage();
有了這個圖象對象,我們就可以用畫板的drawImage函數畫圖了。
g.drawImage(img,0,0,null);
中間兩個參數是圖象繪制時在畫板的起始點坐標。
例如:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class GraExp5 extends JFrame { ImageIcon icon; Image img; public GraExp5() { icon=new ImageIcon(GraExp5.class.getResource("1.gif")); img=icon.getImage(); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setSize(new Dimension(400,300)); show(); } public void paint(Graphics g) { g.drawImage(img,0,0,null); } public static void main(String[] args) { GraExp5 ge=new GraExp5(); } }
程序分析:
需要注意的是,圖象文件所在的位置應該和該類放在同一個目錄中,這樣不至于出錯。
需要注意的是,圖象文件所在的位置應該和該類放在同一個目錄中,這樣不至于出錯。
6、系統擴展,綜合應用,如何為一個窗體設置背景圖片。
要為一個窗體添加背景圖片,必須知道繪制JComponent組件的過程。Swing輕量組件的繪制是組件和組件UI代表合作的結果。
JComponent.paint先繪制組件,然后繪制組件的邊框,再繪制組件的子組件。調用的順序確保組件、邊框和子組件都是可視的。如果組件有一個UI代表,則JComponent.paintComponent調用該代表的Update方法,該方法為不透明組件擦除背景,然后繪制組件。
CInstead是一個不透明的組件,如果重載paint方法,其背景圖是無法被擦除的,因此,即使更新了組件的所有包含組件,在界面上是看不到的。所以必須重載paintComponent方法,在繪制子組件前先擦除背景。
對雙緩存組件,paint方法負責把組件繪制到屏外緩存中,然后把屏外緩存拷貝到組件的屏上代表中,正因為如此,我們不建議為Swing組件重載paint,如果需要重新定義如何繪制組件,那么就重載paintComponent()。
7、用可獲取的字體、樣式、字號修飾文字
(1)函數說明:
字形類Font用于規范組件所使用的字形大小、樣式和字體等。其構造函數:
public Font(String name,int style,int size);
name表示本地可獲取字體名稱
style表示字體樣式,包含Font.PLAIN,Font.BOLD,Font.ITALIC三種,分別對應平體、加粗和斜體。
一個有用的方法用來獲取本地可用字體
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fa=ge.getAvailableFontFamilyNames();
通過從繪圖環境中獲取到本地可用的字體名數組。
要為一個窗體添加背景圖片,必須知道繪制JComponent組件的過程。Swing輕量組件的繪制是組件和組件UI代表合作的結果。
JComponent.paint先繪制組件,然后繪制組件的邊框,再繪制組件的子組件。調用的順序確保組件、邊框和子組件都是可視的。如果組件有一個UI代表,則JComponent.paintComponent調用該代表的Update方法,該方法為不透明組件擦除背景,然后繪制組件。
CInstead是一個不透明的組件,如果重載paint方法,其背景圖是無法被擦除的,因此,即使更新了組件的所有包含組件,在界面上是看不到的。所以必須重載paintComponent方法,在繪制子組件前先擦除背景。
對雙緩存組件,paint方法負責把組件繪制到屏外緩存中,然后把屏外緩存拷貝到組件的屏上代表中,正因為如此,我們不建議為Swing組件重載paint,如果需要重新定義如何繪制組件,那么就重載paintComponent()。
7、用可獲取的字體、樣式、字號修飾文字
(1)函數說明:
字形類Font用于規范組件所使用的字形大小、樣式和字體等。其構造函數:
public Font(String name,int style,int size);
name表示本地可獲取字體名稱
style表示字體樣式,包含Font.PLAIN,Font.BOLD,Font.ITALIC三種,分別對應平體、加粗和斜體。
一個有用的方法用來獲取本地可用字體
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fa=ge.getAvailableFontFamilyNames();
通過從繪圖環境中獲取到本地可用的字體名數組。