国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

java指南之使用圖形:使用原始圖形

2019-11-18 14:15:29
字體:
供稿:網(wǎng)友

  使用原始圖形
接下來的幾頁提供產(chǎn)生原始圖形和文本的細(xì)節(jié)。

繪制外形
這頁告訴你如何繪制諸如直線、矩形、橢圓、弧形和多邊形等外形。
使用文本
這頁告訴你使用Graphics對象的drawString方法繪制文本。它同時告訴你如何使用Font 和 FontMetrics 對象得到字體大小的信息。


繪制外形
Graphics 類定義了繪制下列外形的方法:
直線 (drawLine)
矩形 (drawRect 和 fillRect)
凸起的和下凹的矩形 (draw3DRect 和 fill3DRect)
圓邊的矩形 (drawRoundRect 和fillRoundRect)
橢圓 (drawOval 和 fillOval)
弧線 (drawArc 和 fillArc)
多邊形 (drawPolygon, drawPolyline, 和 fillPolygon)
下面是一個繪制矩形輪廓的例子:
g.drawRect(x, y, rectWidth - 1, rectHeight - 1);

下面是一個繪制填充矩形的例子:
g.fillRect(x, y, rectWidth, rectHeight);

注重,對于 drawRect 方法,你指定的寬度和高度必須比期望的大小至少小1個象素。這是因為繪圖系統(tǒng)在指定的矩形外繪制直線而不是在指定的矩形內(nèi)。同樣的,這個規(guī)則也適用于其它的drawXxx 方法,例如draw3DRect。另一方面,對于fillXxx 方法methods,你指定的高度和寬度和期望的應(yīng)該同樣大。


--------------------------------------------------------------------------------
javaTM 2 注重: 假如你正使用Java 2 (JDKTM 1.2),你可以使用新的JavaTM 2D API,它可以讓你創(chuàng)建任何幾何外形并且指定直線的式樣,尺寸和奇異的填充模式。要了解如何利用這些功能,參考 2D 圖形 教材。非凡地,參考 繪制和填充原始圖形 和 外形 課程,它們介紹了在范例 2: 外形樣本里面的程序的一個Java 2D 實現(xiàn)。
--------------------------------------------------------------------------------


范例 1: 簡單的矩形繪制
下面是一個和在坐標(biāo)系統(tǒng)里面的CoordinatesDemo幾乎一樣的圖片。和CoordinatesDemo相似,這個程序在用戶點擊的地方繪制一個矩形。然而,這個程序的矩形更大而且用黃色填充。下面是程序的GUI截圖:


這個圖片是該applet的GUI。要運行那個applet,單擊圖片。該applet將在一個新瀏覽窗口顯示。

這個程序由兩個組件構(gòu)成。最大的一個是一個名字為RectangleArea的類實現(xiàn)的自定義組件。它繪制傾斜邊界和它里面的所有東西,包括黃色矩形。另一個組件是出現(xiàn)在GUI底部的一個標(biāo)簽,就在自定義組件下面。標(biāo)簽描述程序的當(dāng)前狀態(tài)。
你可以在 RectangleDemo.java找到程序的代碼。下面是自定義組件中和繪圖相關(guān)的代碼:

class RectangleArea extends JPanel {
...
int rectWidth = 50;
int rectHeight = 50;
...
public RectangleArea(...) {
...
Border raisedBevel = BorderFactory.createRaisedBevelBorder();
Border loweredBevel = BorderFactory.createLoweredBevelBorder();
Border compound = BorderFactory.createCompoundBorder
(raisedBevel, loweredBevel);
setBorder(compound);
...
}
...
public void paintComponent(Graphics g) {
super.paintComponent(g); //繪制背景

//在用戶選擇的地方繪制一個填充矩形。
if (point != null) {
g.drawRect(point.x, point.y,
rectWidth - 1, rectHeight - 1);
g.setColor(Color.yellow);
g.fillRect(point.x + 1, point.y + 1,
rectWidth - 2, rectHeight - 2);

controller.updateLabel(point);
}
}
}

組件的paintComponent 方法使用fillRect繪制一個邊長為50的矩形的輪廓,并用邊長為48的黃色矩形填充。注重指定給drawRect 和 fillRect的參數(shù)不同。

--------------------------------------------------------------------------------
注重: 指定x, y, 高度或者寬度值為負(fù)值或者比繪圖區(qū)還大是完全合法的繪圖區(qū)外的值沒有什么影響,因為它們被剪切到繪圖區(qū)。你僅僅不能看見部分外形。外形的負(fù)值的高度和寬度導(dǎo)致的結(jié)果是根本沒有繪制。
--------------------------------------------------------------------------------

關(guān)于這個例子的更多信息,參考坐標(biāo)系統(tǒng),它描述了RectangleDemo的基礎(chǔ):CoordinatesDemo。
范例 2: 外形樣本
ShapesDemo演示了使用JDK 1.1 和 Java 2 API都支持的所有可以繪制和填充的外形。下面是它的GUI的截圖:


這個圖片是該applet的GUI。要運行那個applet,單擊圖片。該applet將在一個新瀏覽窗口顯示。


--------------------------------------------------------------------------------
注重: 除非缺省的字體很小,否則ShapesDemo顯示的一些字符串可能和其它的字符串重疊。得到Font的信息: FontMetrics示范了如何修正這個問題。
--------------------------------------------------------------------------------

你可以在 ShapesDemo.java找到完整的源代碼。下面的片斷僅僅是繪制幾何圖形的代碼,黑體的行是實際的繪圖方法的調(diào)用。rectHeight和 rectWidth 變量指定包含被繪制外形的矩形的象素大小。 x和y 變量對每個外形都改變,因此外形不會彼此覆蓋。 bg 和 fg 變量是 Color 對象,它們分別指定組件的背景色和前景色。

Color fg3D = Color.lightGray;
...
// drawLine(x1, y1, x2, y2)
g.drawLine(x, y+rectHeight-1, x + rectWidth, y);
...
// drawRect(x, y, w, h)
g.drawRect(x, y, rectWidth, rectHeight);
...
// draw3DRect(x, y, w, h, raised)
g.setColor(fg3D);
g.draw3DRect(x, y, rectWidth, rectHeight, true);
g.setColor(fg);
...
// drawRoundRect(x, y, w, h, arcw, arch)
g.drawRoundRect(x, y, rectWidth, rectHeight, 10, 10);
...
// drawOval(x, y, w, h)
g.drawOval(x, y, rectWidth, rectHeight);
...
// drawArc(x, y, w, h, startAngle, arcAngle)
g.drawArc(x, y, rectWidth, rectHeight, 90, 135);
...
// drawPolygon(XPoints, yPoints, numPoints)
int x1Points[] = {x, x+rectWidth, x, x+rectWidth};
int y1Points[] = {y, y+rectHeight, y+rectHeight, y};
g.drawPolygon(x1Points, y1Points, x1Points.length);
...
// drawPolyline(xPoints, yPoints, numPoints)
// 注重: drawPolygon 會閉合多邊形。
int x2Points[] = {x, x+rectWidth, x, x+rectWidth};
int y2Points[] = {y, y+rectHeight, y+rectHeight, y};
g.drawPolyline(x2Points, y2Points, x2Points.length);
...
// fillRect(x, y, w, h)
g.fillRect(x, y, rectWidth, rectHeight);
...
// fill3DRect(x, y, w, h, raised)
g.setColor(fg3D);
g.fill3DRect(x, y, rectWidth, rectHeight, true);
g.setColor(fg);
...
// fillRoundRect(x, y, w, h, arcw, arch)
g.fillRoundRect(x, y, rectWidth, rectHeight, 10, 10);
...
// fillOval(x, y, w, h)
g.fillOval(x, y, rectWidth, rectHeight);
...
// fillArc(x, y, w, h, startAngle, arcAngle)
g.fillArc(x, y, rectWidth, rectHeight, 90, 135);
...
// fillPolygon(xPoints, yPoints, numPoints)
int x3Points[] = {x, x+rectWidth, x, x+rectWidth};
int y3Points[] = {y, y+rectHeight, y+rectHeight, y};
g.fillPolygon(x3Points, y3Points, x3Points.length);
...


使用文本
對于原始的文本的支持是在AWT的 Graphics, Font,, 和 FontMetrics 類上展開的。當(dāng)然,你也可以通過使用文本繪制組件來給自己減少很多麻煩--例如 標(biāo)簽 或者 文本組件。


--------------------------------------------------------------------------------
JavaTM 2 注重: 假如你正使用Java 2 (JDKTM 1.2),你可以使用JavaTM 2D API中的豐富特性的文本支持。參考2D 圖形教材中的 2D 圖形 一節(jié)得到更多信息。然而,我們?nèi)匀煌扑]避免自己繪制文本而是使用標(biāo)準(zhǔn)的Swing 組件。
--------------------------------------------------------------------------------


繪制文本
Graphics 類提供三個繪制文本的方法: drawBytes, drawChars, 和 drawString。下面是向屏幕上繪制字符串的一個例子:
g.drawString("Hello World!", x, y);

對于文本繪制方法,x 和y是指定文本的左下角的位置的整數(shù)。更精確的講,y 坐標(biāo)指定文本的基線(baseline) -- 大多字母停留的線 --它沒有包含像"y"這樣的下行字母(descenders) 的尾部的空間。確定y值足夠大以滿足文本的垂直空間的要求,但是要足夠小以確保對下行字母也有足夠的空間。
下面是一個顯示基線的圖片,也顯示了頂線和底線。你會在稍后了解更多關(guān)于頂線和底線的知識。




這是一個簡單的applet的截圖,它說明了假如你不注重你的文本的位置會發(fā)生什么:




這個圖片是該applet的GUI。要運行那個applet,單擊圖片。該applet將在一個新瀏覽窗口顯示。

字符串頂被截去了,因為它的y參數(shù)是5,字符串的基線以上只有5個象素的空間 --對于大多字體這是不夠的。中間的字符串可能顯示得很好,除非你使用很大的字體。下面的字符串的大多顯示得很好,除了下行字母。下面的字符串的所有下行字母被截去,因為顯示這個字符串的代碼沒有為它們預(yù)備足夠的空間。你可以在 TextXY.java得到完整的代碼。


--------------------------------------------------------------------------------
注重: 文本繪制方法對x 和 y的解釋和外形繪制方法的不同。當(dāng)繪制一個外形(例如矩形)時, x 和 y指定外形的范圍矩形的左上角而不是左下角。
--------------------------------------------------------------------------------

得到Font的信息: FontMetrics
The shape-painting example from 范例 2: 外形樣本中的外形繪制的范例可以通過選擇一個比通常缺省的字體小的字體來進(jìn)行改進(jìn)。下面的例子進(jìn)行了這個工作并且擴大了外形以占據(jù)由于字體的減小而釋放的空間。下面是改進(jìn)的applet的截圖:


--------------------------------------------------------------------------------



這個圖片是該applet的GUI。要運行那個applet,單擊圖片。該applet將在一個新瀏覽窗口顯示。


--------------------------------------------------------------------------------

你可以在 FontDemo.java得到全部代碼。 范例通過使用一個FontMetrics對象得到字體的大小的具體情況而選擇合適的字體。例如下面的循環(huán)確保applet ("drawRoundRect")中顯示的最大的字符串適合為它分配的空間。

boolean fontFits = false;
Font currentFont = biggestFont;
FontMetrics currentMetrics = getFontMetrics(currentFont);
int size = currentFont.getSize();
String name = currentFont.getName();
int style = currentFont.getStyle();

while (!fontFits) {
if ( (currentMetrics.getHeight() <= maxCharHeight)
&& (currentMetrics.stringWidth(longString)
<= xSpace)) {
fontFits = true;
} else {
if (size <= minFontSize) {
fontFits = true;
} else {
currentFont = new Font(name, style, --size);
currentMetrics = getFontMetrics(currentFont);
}
}


上面的范例代碼使用了Graphics的 getFont, setFont, 和 getFontMetrics方法得到當(dāng)前和設(shè)置當(dāng)前字體以及得到對應(yīng)字體的FontMetrics對象。從FontMetrics的 getHeight 和 stringWidth(String) 方法中,代碼得到字體的垂直和水平尺寸。(譯者注:stringWidth(String)得到的應(yīng)該是參數(shù)指定的字符串在使用對應(yīng)字體時的總的水平長度。)
下面的圖片顯示了一個FontMetrics對象可以提供的一些有關(guān)字體尺寸的信息。




下面是FontMetrics對象的返回字體的垂直大小的信息的方法的一個概要:


int getAscent(), int getMaxAscent()
getAscent 方法返回頂線和基線之間的象素大小。通常,頂線代表大寫字母的典型高度。特定的,字體的設(shè)計者選擇的上行和下行值用來表示恰當(dāng)?shù)匚谋尽巴饷病保蛘哒f墨跡的密度,因此文本就可以像設(shè)計者期望的那樣顯示。上行值通常為幾乎所有的字體中的字符提供足夠的空間,除了大寫字母的accents。getMaxAscent方法計算這些異常高大的字符。

int getDescent(), int getMaxDescent()
getDescent 方法返回基線和底線之間的象素大小。對應(yīng)大多字體,字體中的字符的最低點都在底線以上。可以在萬一的情況下,你可以使用getMaxDescent 方法得到能保證包容所有字符的距離。

int getHeight()
返回兩個文本的基線間的象素大小。注重這包括行間距。

int getLeading()
得到兩行文本間的暗示的距離的象素大小。明確的說,行間距是上一行的的底線和下一行的頂線間的距離。順便說一下,leading 的發(fā)音為 LEDDing。
注重字體的大小 (Font的getSize方法返回的值)是一個抽象的尺寸。理論上,它對應(yīng)上行值和下行值的和。然而,實際上,字體的設(shè)計者才最終決定一個"12 point"的字體的大小。 例如,12點Times字體通常比12點Helvetica字體稍微短一些。通常情況下,字體大小是以點來衡量的,它大約是1/72英寸。

下面的列表顯示了FontMetrics對象提供的返回字體的字符的水平大小的方法。這些方法考慮了每個字符四周的空間。更確切的講,每個方法返回的 不是某個特定字符(或者多個字符)占據(jù)的象素大小,而是 the number of pixels taken up by a particular character (or characters), but the number of pixels by which the current point will be advanced when that character (or characters) is shown. 我們稱它為advance width以和字符或者文本的寬度相區(qū)分。


int getMaxAdvance()
字體中的最寬的字符的advance width(以象素為單位)。
int bytesWidth(byte[], int, int)
由字節(jié)數(shù)組表示的文本的advance width。第一個整型參數(shù)指定數(shù)組中的開始偏移量。第二個整型參數(shù)指定數(shù)組中最后一個需要檢查的位置。
int charWidth(int), int charWidth(char)
指定字符的advance width。
int charsWidth(char[], int, int)
由指定的字符數(shù)組表示的文本的advance width。
int stringWidth(String)
指定字符串的advance width。
int[] getWidths()
字體中的前256個字符的advance width。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 衢州市| 米易县| 泉州市| 平泉县| 巴里| 庄河市| 永城市| 犍为县| 延安市| 石渠县| 平昌县| 句容市| 武乡县| 咸阳市| 龙井市| 贵州省| 正安县| 峨眉山市| 通渭县| 观塘区| 宜兴市| 张家界市| 安远县| 松溪县| 丹巴县| 南宁市| 钟山县| 辉县市| 洞头县| 马公市| 申扎县| 赤壁市| 左权县| 普安县| 凤台县| 湄潭县| 凭祥市| 原阳县| 如皋市| 呼图壁县| 安平县|