【Java精品源码栏目提醒】:本文主要为网学会员提供“Java 图形结构 - 技术总结”,希望对需要Java 图形结构 - 技术总结网友有所帮助,学习一下!
计算机与工程问题解决导论 第17讲: 实验:图形2D API Prof.Steven R.Lerman Dr.V.Judson Harward
Java图形2维API的起源 最初的JavaGUI工具包AWT是一种快速的粗糙的方法。
它 使用本地同级组件绘制所有的窗口小部件 Swing使用
Java方法而不是依靠特定的窗口小部件平台绘 制除了顶层容器之外的所有组件。
为了完成这个,Swing需要改良的制图法 而
Java 2维API就是为了这个而产生的 现在已经有了
Java3维API 在 http://
java.sun.com/docs/books/tutorial/2d/index.html 查 看 辅导
Java图形结构 NgonApp 自定义绘图Swing组件:JLabel和JTextField 如何在
Java中绘图 你可能会想如果你想要在
Java中完成你自 己的绘图,你是在主线程来绘图就如同在 主线程中创建一个GUI组件一样 实际上,你需要在主线程中在你需要绘图 的地方创建组件如同你所有的其他GUI组件 一样 但绘图应该在事件线程中完成 为了了解为什么这么做,我们从考虑何时 开始绘图着手 GUI何时绘制 在初始显示时(不是必须条件当程序开始的时 候) 当显示“损坏”时。
例如,当它一下不见然后又出 现的时候 当内容改变的时候,当Swing或程序员编写的代码 调用refreshrepaint的时候 -记得前面介绍的tick方法吗? public void tick minutes // 分钟自加 repaint //更新表的显示 GUI如何绘制 Swing确定绘制的进度。
它可以结合多重重 画请求 Swing按顺序调用下面3种方法(在事件线 程中): painComponent paintBorder paintChildren 最后一种方法递归绘制一个容器的子容器 如何来做自定义绘图 标准Swing组件如JLabel和JComboBox使 用paintComponent来绘制它们自己 如果你想要做自定义绘图,继承一个容器 类通常为JPanel,并重写paintComponent 在paintComponent中调用2D API来在 JPanel背景上绘制你想要的图形 重写getPreferredSize或调用 setPreferredSize来设置你JPanel的大小 Graphic类 paintComponent通过一个参数Graphic g来调用。
该参数作为绘图工具包初始化为组件的默认值 在最近的JDK版本中,该参数可以为一个2维图形 对象,继承了Graphic。
因此,对它进行转换。
Graphic是原始AWT类 使用2D API通常这样开始: public void paintComponent Graphics g super.paintComponent g Graphics2D g2 Graphics2D g //绘图命令从这开始 Graphic参数是如何来的 painComponent方法的Graphic参数是组 件的默认graphic值的快照比如字体和绘图 颜色 它只是这些值的复制。
每次paint方法被调 用,就得到一个新的图形对象 你调用paintComponent的时候对Graphic 实例作出的改变不会累积到下次对方法的 调用。
setFont这样的方法不会改变组件 自身 基础2维API操作可以使用Graphics2D参数来: 1.使用方法public void drawShape s画轮廓和外形 2.使用方法public void fillShape s来填充外形可以使用Graphics或Graphics2D参数来: 1.使用方法public void drawImage…来绘图 2.使用方法public void drawstring…来绘制文本 Graphic2D表现上下文2D API的大多能力来自用户设置Graphic2D对 象属性的能力 -public void setStrokeStroke s -public void setPaintPaint p -public void setFontFont f -public void setCompositeComposite c -public void setTransformTransform t -public void setRenderingHintsMap m 自定义绘图模板import
java.awt. // Graphics2D Paint Shape …import
java.awt.geom. //连续Shape类import javax.swing. // JPanel等public class MyPanel extends JPanel public void paintComponent Graphics g super.paintComponent g Graphics2D g2 Graphics2D gg2.setPaint/Stroke/Font/etc...Shape s new Shape2D.Float/Double ... g2.draw/fill s … 2维形状 Shape是在
java.awt中定义的一个接口,但所 有执行Shape的类在
java.awt.gemo中定义 Shape可分为两个版本,一个是高精度坐标 轴另一个是低精度的,如: Ellipse2D.Double // 高精度 Ellipse2D.Float //低精度 每个形状都有不用的构造函数的参数, double或float,取决于它们是高精度还是低 精度 创建一个EclipseShape s new Ellipse2D.Double 100.0//x轴坐标 50.0 //y轴坐标 300.0//宽度 150.0//高度 Graphic2D坐标轴 Graphic2D对象使用通用坐标系(相对于设 备坐标系),
Java称之为用户空间 Graphic2D形状和操作以浮点定义(float或 double)但y轴坐标朝下 一些Graphic2D只把float作参数 设计浮点坐标系是为了使图形同输出设备 相对独立 设计2D API可用于打印也可用于输出 Graphic2D默认转换 2D渲染管线提供一般的转换来映射用户空 间到设计空间 默认转换映射1.0用户空间单位为1/72一英 尺,这恰好是屏幕的典型象素尺寸或打印 机的点的大小 因为除非你做一些特殊的,2D绘图默认为 象素坐标 Ellipse.
java 1 Ellipse.
java 2 Strokes和Paint Stroke是一个接口,BasicStroke是唯一执行它的 类 你可以把Stroke想成一支笔,Paint想成相应的墨 水 BasicStroke同定义Stroke如何结束和对待连接点 的选择一样有宽度和虚线格式 Color执行Paint接口,这样
Java Color是Paint的 最简单的分类 Paint可以使用一个模式或纹理(比如油漆) 练习 1. 使用Graphics2D draw方法替代fill来 获得轮廓 2. 改变Stroke为10单位厚。
单位是什么? 3. 使得椭圆为一个圆 4. 改变圆为一个方形(查看Rectangle2D) GeneralPath 你如何定义你自己的Shape? 使用GeneralPath。
通过添加可以为ShapeS LineS或曲 线的路径组件定义轮廓NullSymbol.
java 1NullSymbol.
java 2 绘制文本 直到现在为止我们使用JLabels表示文本 可以使用Graphics2D方法直接绘制文本: 坐标系定义文本出现的基本线的左边界 Signature.
java 1 Signature.
java 2 练习:创建NgonApp 1 创建一个应用程序描述一个多边形当它的 边增加的时候是如何接近于圆。
从课程网页下载的JavaFiles.zip打开文件 NgonApp.
java和NgonView.
java,保存到一 个新的目录中。
创建一个新的工程。
编译并运行。
创建NgonApp2在你改变之前NgonApp应该看起来这样: 创建NgonApp3 我们来检查源代码 NgonApp.
java包含main方法,并且布置GUI。
你不需要改变它。
注意到它创建NgonView的实例 并把它放入内容面板的中心 它使用JTextField来询问多边形边的数目。
当你输 入一个返回值到JTextField中,它将发出一个行为 事件。
检查ActionEvent是如何处理的。
记住当指 定多边形少于3条边的时候必须是错误的。
我们在 NgonView中处理该错误。
初始NgonViewNgonView为完成所有自定义绘图的类。
初始版本应 该只有paintComponent代码来绘制北京和特定的 帮助方法。
-void setSidesint n:安装一个新的多边形的边 -double getRegPolyArea int n :计算规则多边形 的面积 -Dimensiion getPreferedSize:返回一个固定的 尺寸 -float transX float x : float transY float y :我们后面来看 NgonApp第一版本 在添加代码后 NgonApp第一次修改 修改NgonView.
java这样它将或者显示一个错误 信息或者每次边的数目改变的时候显示多边形面 积。
你需要创建一个适当的字体,但只需要修改 paintComponent来在textX textY绘出适当的 信息。
编译并检验 现在再次修改paintComponent来绘制一个蓝色 的圆笔触为两象素宽。
不要使用transX/transY 编译并检验 现在以黄色填充圆。
你想要先绘出轮廓然后填充 还是反过来?为什么? NgonView Mod1 画出圆的位置 NgonApp修改2 为了绘出在一个单位圆中的规则的多边形,把圆 心位于坐标中心是最简单的方法。
注意到比例已 经设置这样圆是一个单位圆。
transX和transY 转换这个坐标系系统的点为窗口的象素坐标系。
检验它。
圆中心是00。
transX0是什么? transY0呢? 通过使用transX/Y定义限制框的左上角和 SCALE来定义宽度和高度来看你能否在 NgonView重创建填充的圆。
编译和检验 NgonView Mod2 使用转换坐标系 NgonView Mod3 包含多边形,1 NgonView 包含多边形,2 现在使用GeneralPath(和transX和transY 方法)来创建填充的多边形。
在1 0开始 路径。
计算顶点间的中心角。
使用循环来 生成第一个n-1边,closePath来生成最后 一条边。
记住因为y的正方向向下第一个顶 点将在x轴下面,不是像平常坐标系一样在 上面。
添加适当的方法调用 paintComponent填充多边形 编译并检验
上一篇:
JAVA语言概述【特荐
下一篇:
bc80e7a0-d1f2-4595-b21d-01a76798e87a