Java程序设计——12图形绘制
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
赵志崑
设置字体
• 设置当前字体:void setFont(Font font) • 获取当前字体:Font getFont() • Font的构造器:Font(String name, int style, int size)
– name:字体名称,可以用下面的方法获取系统支持的所有字体:
• String[] GraphicsEnvironment. getLocalGraphicsEnvironment(). getAvailableFontFamilyNames()
赵志崑
输出文字
• 将字符串输出到特定位置:
– void drawString(String str, int x, int y)
(x,y) 见TextExample.java g.drawString("Hello World!",50,50); g.drawString("世界你好!",50,100);
(x,y) 见GraphicsExample.java g.drawOval(10,10,100,50); g.fillOval(160,10,100,50); width
height
赵志崑
绘制弧线
• void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) – 绘制一条弧。 • void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) – 填充一个扇形。
(x1,yLeabharlann Baidu) (x1,y1)
见GraphicsExample.java g.drawLine(10,20,60,50);
X
Y
赵志崑
绘制矩形
• void drawRect(int x, int y, int width, int height) – 绘制一个矩形。 • void fillRect(int x, int y, int width, int height) – 填充一个矩形。
150
赵志崑
设置颜色
• void setColor(Color c):将当前画笔颜色设置为c。 • Color getColor():读取当前画笔颜色。 • 颜色的构造: – 构造函数Color(int r, int g, int b):参数为红、绿、蓝的值(0-255)。 – 直接使用Color类中的静态对象:如Color.blue, Color.yellow, Color.orange, ……
见PanelExample.java public class PanelExample extends JFrame { …… public PanelExample() { …… contentPane.add(new MyPanel()); } } class MyPanel extends JPanel { public void paintComponent(Graphics g) { //绘图部分代码 super.paintComponent(g); g.drawRect(10,10,100,50); } } 赵志崑
见GraphicsExample.java g.drawRoundRect(10,10,100,50,20,15); g.fillRoundRect(160,10,100,50,20,15);
arcWidth
arcHeight
width
height
赵志崑
绘制椭圆
• void drawOval(int x, int y, int width, int height) – 绘制一个椭圆 • void fillOval(int x, int y, int width, int height) – 填充一个椭圆
• paintComponent方法的参数:
– Graphics g:绘图对象,所有绘图动作都是对其方法的调用。g相 当于一块画布,主要有以下几类方法:
• • • • 绘制简单几何图形,如矩形、椭圆等; 绘制图像,如图片; 绘制文字; 设置画笔属性,如颜色、文字字体、绘图模式等。
赵志崑
绘制直线
• void drawLine(int x1, int y1, int x2, int y2) – 绘制一条线。
计算机科学与技术学院 赵志崑 zhaozk@sdufe.edu.cn
在组件上绘制图形
• 图形可以绘制在任意Swing组件上,但一般绘制在面板 (JPanel)上,因为面板是空白的。绘制图形需要三步:
– 定义一个扩展自JPanel的新类; – 覆盖其paintComponent方法,将绘图的语句添加在这个方法中; – 创建一个新类的对象,添加到要显示的容器中。
见ImageExample1.java public void paintComponent(Graphics g) { 118 …… int sx1 = 118 * unitIndex; int sy1 = 0; 98 int sx2 = sx1 + 117; int sy2 = sy1 + 97; 0 int dx1 = unitX; int dy1 = unitY; int dx2 = dx1 + 117; int dy2 = dy1 + 97; (dx1,dy1) g.drawImage(unitsImage,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,null); } public void setUnitLocation(int aX, int aY) { …… unitIndex = (unitIndex + 1) % 4; repaint(); 赵志崑 } duke.gif (sx1,sy1) unitsImage
height 见GraphicsExample.java g.drawArc(10,10,100,50,0,60); g.fillArc(160,10,100,50,0,60); (x,y) width
arcAngle
startAngle
赵志崑
绘制多边形
• void drawPolygon(Polygon p) – 绘制一个多边形 • void fillPolygon(Polygon p) – 填充一个多边形
(x,y) width
见GraphicsExample.java g.drawRect(10,20,60,50); g.fillRect(80,20,60,50);
height
赵志崑
绘制圆角矩形
• void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) – 绘制一个圆角矩形 • void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) (x,y) – 填充一个圆角矩形
赵志崑
绘制图像-1
• drawImage(Image img, int dx, int dy, ImageObserver observer) – 将img中图片绘制到当前画布。 globe.gif
见ImageExample.java class ImagePanel extends JPanel { private Image unitsImage = null; private int unitX; private int unitY; public ImagePanel() { Toolkit kit = Toolkit.getDefaultToolkit(); unitsImage = kit.getImage("globe.gif"); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawRect(10,10,100,100); g.drawImage(unitsImage,unitX,unitY,null); } public void setUnitLocation(int aX, int aY) { unitX = aX; unitY = aY; repaint(); } } 赵志崑
paintComponent方法
• 此方法是一个回调方法,声明如下:
– public void paintComponent(Graphics g)
• paintComponent方法在组件需要绘制时被自动调用:
– – – – 面板首次显示时; 面板尺寸变化时; 其它窗口遮住面板时; 组件的repaint()方法被调用时。
见ColorExample.java int red = 0; int green = 0; int blue = 0; int gray = 0; for(red = 0; red <= 255; red += 16) { g.setColor(new Color(red,green,blue)); g.fillRect(red+16,16,15,15); } ……
• 解决:
– Java采用一个MediaTracker来跟踪图片的加载过程。
见ImageExample1.java public ImagePanel() { 1、创建一个MediaTracker对象; Toolkit kit = Toolkit.getDefaultToolkit(); 2、用addImage方法将正在装入的 unitsImage = kit.getImage("duke.gif"); MediaTracker tracker = new MediaTracker(this); 图片加入到MediaTracker对象,并 tracker.addImage(unitsImage,0); 赋予一个编号; try{ tracker.waitForID(0); 3、用waitForID(编号)方法等待图 }catch(Exception e) 片装入完成。 { System.out.println(e); } } 赵志崑
unitsImage
绘制图像-2
• drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
– 将img中的一个矩形区域绘制到当前画布的一个矩形区域,且可拉伸。 – 透明的部分不绘制(gif图片可以指定一个透明色),用于绘制不规则图像。
见GraphicsExample.java Polygon p = new Polygon(); p.addPoint(10,10); p.addPoint(100,30); p.addPoint(50,50); p.addPoint(100,70); p.addPoint(30,100); g.drawPolygon(p); p.translate(150,0); g.fillPolygon(p); (10,10) (100,30) (50,50) (100,70) (30,100)
1
2 (sx2,sy2) 3
(dx2,dy2)
等待图像加载
• 问题:
– Java加载图片文件(kit.getImage)的时候,采用异步的方式,即图片文件 可能还没有加载完,getImage方法就返回了。这是为了适应网络速度慢 下加载图片的时间比较长的情况。 – 此时,如果使用图片的数据,则是错误的。因此需要一种机制等待图片 加载完成。
– style:字体形式,为Font.PLAIN,Font.BOLD,Font.ITALIC。 – size:字体的高度,单位为像素。
• 这些设置字体的方法同样可以应用于组件上显示的字体。
见FontExample.java public void paintComponent(Graphics g) { super.paintComponent(g); g.setFont(new Font(fontName,fontStyle,fontSize)); g.drawString("Hello World!",50,50); g.drawString("世界你好!",50,100); }