實(shí)例025 繪制公章
實(shí)例說明
本實(shí)例演示如何使用坐標(biāo)軸平移、縮放、繪制橢圓、繪制多邊形和繪制文本等技術(shù)實(shí)現(xiàn)公章的繪制。運(yùn)行程序,將在窗體上顯示繪制的公章,效果如圖1.25所示。
關(guān)鍵技術(shù)
本實(shí)例主要是通過在JPanel類的子類中,重寫JComponent類的paint()方法,并在該方法中使用Graphics2D類的translate()、setColor()、scale()、drawString()、fillPolygon()和draw()等方法來實(shí)現(xiàn)的。
(1)使用Graphics2D類的translate()方法將坐標(biāo)軸平移到指定點(diǎn)。
(2)使用Graphics2D類的setColor()方法設(shè)置顏色。
(3)使用Graphics2D類的scale()方法對(duì)公章中的文本進(jìn)行縮放。
(4)使用Graphics2D類的drawString()方法繪制文本,該方法是從Graphics類繼承的。
(5)使用Graphics2D類的fillPolygon()方法繪制公章的五星,該方法也是從Graphics類繼承的。
(6)使用Graphics2D類的draw()方法繪制表示公章的圓。
設(shè)計(jì)過程
(1)新建一個(gè)項(xiàng)目。
(2)在項(xiàng)目中創(chuàng)建一個(gè)繼承JFrame類的DrawCachetFrame窗體類。
(3)在DrawCachetFrame窗體類中,創(chuàng)建內(nèi)部面板類DrawCachetPanel,并重寫JComponent類的paint()方法,在該方法中實(shí)現(xiàn)公章的繪制。
(4)將內(nèi)部面板類DrawCachetPanel的實(shí)例,添加到窗體類DrawCachetFrame的內(nèi)容面板上,用于在窗體上顯示繪制的公章,代碼如下:
class DrawCachetPanel extends JPanel { // 創(chuàng)建內(nèi)部面板類
public void paint(Graphics g) { // 重寫paint()方法
Graphics2D g2 = (Graphics2D) g; // 獲得Graphics2D對(duì)象
g2.translate(170, 100); // 平移坐標(biāo)軸
BasicStroke stroke = new BasicStroke(6); // 創(chuàng)建寬度是6的筆畫對(duì)象
g2.setStroke(stroke); // 設(shè)置筆畫對(duì)象
// 繪制圓
Ellipse2D.Float ellipse = new Ellipse2D.Float(-80, -80, 160, 160); // 創(chuàng)建圓對(duì)象
Color color = new Color(255, 0, 0); // 創(chuàng)建顏色對(duì)象
g2.setColor(color); // 指定顏色
g2.draw(ellipse); // 繪制圓
// 繪制五星
int[] x1 = { 0, 8, 30, 16, 25, 0, -25, -16, -30, -8 }; // 多邊形的橫坐標(biāo)
int[] y1 = { -35, -10, -15, 5, 28, 10, 28, 5, -15, -10 }; // 多邊形的縱坐標(biāo)
int n1 = 10; // 多邊形的邊數(shù)
g2.fillPolygon(x1, y1, n1); // 繪制多邊形
// 繪制文本
g2.scale(1.8, 1.8); // 放大
Font font = new Font("宋體", Font.BOLD, 12); // 創(chuàng)建字體
g2.setFont(font); // 設(shè)置字體
g2.drawString("專 用 章", -25, 30); // 繪制文本
int width = getWidth(); // 獲得面板寬度
int height = getHeight(); // 獲得面板高度
char[] array = " 明日科技有限公司 ".toCharArray(); // 把字符串轉(zhuǎn)換為字符數(shù)組
int len = array.length * 2; // 定義半徑
font = new Font("宋體", Font.BOLD, 10); // 創(chuàng)建新字體
g2.setFont(font); // 設(shè)置字體
double angle = 0; // 初始角度
for (int i = 0; i < array.length; i++) { // 遍歷字符串中的字符
int x = (int) (len * Math.sin(Math.toRadians(angle + 270))); // 計(jì)算每個(gè)文字的位置
int y = (int) (len * Math.cos(Math.toRadians(angle + 270))); // 計(jì)算每個(gè)文字的位置
g2.drawString(array[i] + "", width / 2 + x - 168, height / 2 - y - 95); // 繪制每個(gè)字符,其中168和95是坐標(biāo)平移值
angle = angle + 360d / array.length; // 改變角度
}
}
}
秘笈心法
心法領(lǐng)悟025:正確設(shè)置繪圖上下文的屬性。
在進(jìn)行圖形和文本的繪制時(shí),要求能夠正確設(shè)置繪圖上下文的屬性,如文本的字體、顏色,圖形線條的粗細(xì)、虛實(shí)及顏色等,正確設(shè)置的方法是在繪制每一種新樣式的文本或圖形之前,先對(duì)繪圖上下文的屬性進(jìn)行設(shè)置,然后再繪制文本和圖形,這樣設(shè)置的繪圖上下文屬性才是有效的。