点击查看:2015计算机等级考试二级Java入门教程章节汇总
点击查看:2015计算机等级考试二级Java入门教程第十四章汇总
14.8 定义自己的几何图形
在Sketcher中定义几何图形的所有类都静态地嵌套在Element类中。正像我们已经说过的,这样做除了能够保证几何图形类定义在一起外,还避免了Java类库与Rectangle这样的类发生冲突的可能。
我们可以从最简单的描述直线类开始。
定义直线
一条直线由两个点和它的颜色定义。我们可以在基类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对象。构造函数有一个参数,分别为Point直线的两个端点以及它的颜色,构造函数的Point可以是Point2D类型,或者当Point2D是Paint的超类时也一可以是Point,在把颜色传递给基类构造函数以后,把这条直线创建为Line2D.Double对象。由于这个类实现了Shape接口,所以可以从getshape方法以Shape类型返回它。
getBounds()方法不会这样简单。我们只用Line对象的getBounds()方法返回了产生的Rectangle对象。要注意我们是如何限定返同类型的。这样限定是因为我们将耍把Rectangle类嵌套到Element类中,如果我们这样实现,编译程序将把这里的Rectangle类型解释为我们的矩形类,而不是定义在java.awt包中的那个矩形类。在出现这类冲突时,你总是可以提供限定的类名。
如果你把保存为Element.java的类定义Element放在Sketcher类的同一个目录中,所需要做的全部工作就是确保将MouseHandler类中的CreateElement()成员,除Element.Line之外的所有构造函数都变成注释,该类是SketchView的内置类。方法的代码应该这样:
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对象被反复地建立并且进行绘制来产生橡皮筋的效果。每条直线从你按下鼠标按键的位置点到当前光标位置。试着绘制不同的颜色。这些操作应该都能够完成。如果不能操作,或许是因为你忘记删除临时放在SketchFrame的ColorAction actionPerformed()方法中的getContentPane().setBackground(Color)调用了。
如果你键入完代码(我希望这样),若添加到Sketcher中的代码量较人时,有可能会出现一些错误。在这种情况下,请回到本书前面的代码中找出其原因。在你做这项工作之前,试着使用JDK的Java调试器或者用print()标识出可能出现问题的地方,这样你就可以继续跟踪。在你编写自己的代码时这样做是个好习惯。
定义矩形
绘制矩形的交互方法类似于直线。当你绘制一个矩形时,鼠标按下的点定义矩形的第一个角当你拖动鼠标光标位置时,将定义相对着的角。如下说明所不:
释放鼠标按键将建立被存储在模式中最后的矩形图形。正像你所看到的,你按下鼠标按键的光标位置可以作为矩形的任何一个角。从便于应用的角度来说,这样很好:但是我们的代码实际上一认为Rectangle2D对象指的总是左上角,以及宽度和高度。
示意图显示了4种关于绘制矩形拖动鼠标路径标位最小的端点,宽度是两个x和y坐标值的最小的端点,宽度是两个X坐标差的绝对值,高度是两个y坐标差的绝对值。我们可以按照这种形式定义我们的类。
相关推荐:
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |