點擊查看:2015計算機等級考試二級Java入門教程章節(jié)匯總
點擊查看:2015計算機等級考試二級Java入門教程第十四章匯總
14.8 定義自己的幾何圖形
在Sketcher中定義幾何圖形的所有類都靜態(tài)地嵌套在Element類中。正像我們已經(jīng)說過的,這樣做除了能夠保證幾何圖形類定義在一起外,還避免了Java類庫與Rectangle這樣的類發(fā)生沖突的可能。
我們可以從最簡單的描述直線類開始。
定義直線
一條直線由兩個點和它的顏色定義。我們可以在基類Element中嵌套定義Line類,如下所示:
import java.awt.*; //For the Shape class
import java.awt.geom.*; //For classes defining shapes
class Element
//Code defining the base class....
//Nested class defining a line...
public static class Line extends Element
{
public Line(Point start,Point ebd, Color)
{
super(color);
line=new Line2D.Double(start,end);
}
public Shape getshape()
{
return line;
}
public java.awt.Rectangle getBounds()
{
return line.getBounds();
}
public void modify(Point start,Point last)
{
line.x2=last.x
line.y2=last.y
}
private Line2D.Double line;
}
}
Line類是static。因此它不從屬于任何一個可用的Element對象。構(gòu)造函數(shù)有一個參數(shù),分別為Point直線的兩個端點以及它的顏色,構(gòu)造函數(shù)的Point可以是Point2D類型,或者當Point2D是Paint的超類時也一可以是Point,在把顏色傳遞給基類構(gòu)造函數(shù)以后,把這條直線創(chuàng)建為Line2D.Double對象。由于這個類實現(xiàn)了Shape接口,所以可以從getshape方法以Shape類型返回它。
getBounds()方法不會這樣簡單。我們只用Line對象的getBounds()方法返回了產(chǎn)生的Rectangle對象。要注意我們是如何限定返同類型的。這樣限定是因為我們將耍把Rectangle類嵌套到Element類中,如果我們這樣實現(xiàn),編譯程序?qū)堰@里的Rectangle類型解釋為我們的矩形類,而不是定義在java.awt包中的那個矩形類。在出現(xiàn)這類沖突時,你總是可以提供限定的類名。
如果你把保存為Element.java的類定義Element放在Sketcher類的同一個目錄中,所需要做的全部工作就是確保將MouseHandler類中的CreateElement()成員,除Element.Line之外的所有構(gòu)造函數(shù)都變成注釋,該類是SketchView的內(nèi)置類。方法的代碼應該這樣:
private Element createElement(Point start, Point end)
{
switch(theApp.getWindow().getElementType())
{
case LINE:
return new Element.Line(start, end,
theApp.getWindow().getElementColor());
// case RECTANGLE:
// return new Element.Rectangle(start, end,
// theApp.getWindow().getElementColor());
// case CIRCLE:
// return new Element.Circle(start, end,
// theApp.getWindow().getElementColor());
// case CURVE:
// return new Element.Curve(start, end,
// theApp.getWindow().getElementColor());
}
return null;
}
如果你編譯并運行Stretcher,應該能夠繪制一幅如下所示的圖形。
我們在此還只能繪制直線。試著繪制一些東西,否則將會拋出Nu1lPointException,這是因為CreateElement()方法將返回null,而不是幾何圖形的引用。
如何工作
當你拖動鼠標時,Element_Line對象被反復地建立并且進行繪制來產(chǎn)生橡皮筋的效果。每條直線從你按下鼠標按鍵的位置點到當前光標位置。試著繪制不同的顏色。這些操作應該都能夠完成。如果不能操作,或許是因為你忘記刪除臨時放在SketchFrame的ColorAction actionPerformed()方法中的getContentPane().setBackground(Color)調(diào)用了。
如果你鍵入完代碼(我希望這樣),若添加到Sketcher中的代碼量較人時,有可能會出現(xiàn)一些錯誤。在這種情況下,請回到本書前面的代碼中找出其原因。在你做這項工作之前,試著使用JDK的Java調(diào)試器或者用print()標識出可能出現(xiàn)問題的地方,這樣你就可以繼續(xù)跟蹤。在你編寫自己的代碼時這樣做是個好習慣。
定義矩形
繪制矩形的交互方法類似于直線。當你繪制一個矩形時,鼠標按下的點定義矩形的第一個角當你拖動鼠標光標位置時,將定義相對著的角。如下說明所不:
釋放鼠標按鍵將建立被存儲在模式中最后的矩形圖形。正像你所看到的,你按下鼠標按鍵的光標位置可以作為矩形的任何一個角。從便于應用的角度來說,這樣很好:但是我們的代碼實際上一認為Rectangle2D對象指的總是左上角,以及寬度和高度。
示意圖顯示了4種關于繪制矩形拖動鼠標路徑標位最小的端點,寬度是兩個x和y坐標值的最小的端點,寬度是兩個X坐標差的絕對值,高度是兩個y坐標差的絕對值。我們可以按照這種形式定義我們的類。
相關推薦:
2015計算機等級考試二級Java入門教程章節(jié)匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |