【Java】图形、图像与音频(实验十二)

一 、Component组件类中有一个public void paint( Graphics g)绘画方法,只要用户自定义的类继承了此组件类或其子类并重写了paint()方法,当用户自定义的类被实例化后,此时java运行环境就会开启一个新线程来自动调用并执行用户自定义类中的paint()方法,从而实现用户可以在重写paint()方法的组件(容器)类的对象上绘制各种图形图像。其绘制图形的一般步骤如下:

①用户自定义一个类并继承Component组件类的子类如:JPanel、Canvas类等

②在用户自定义的容器组件类中重写paint(Grapics g)方法后用户就可以在其方法内使用Grapics类或其子类Grapics2D的形参g对象,在用户自定义的类组件上绘制各种图形图像。

③在主程序中创建主窗口和用户自定义组件容器类的实例后,将其实例组件添加到主窗口中,java虚拟机便可以在用户自定义的组件上绘制各种图形。

注意:在使用Graphics类或其子类的对象绘制图形时,需要先创建出图形对象然后Graphics2D类的对象在调用draw(图形对象)fill(图形对象)来绘制或填充图形。

二、组件都是矩形形状并都有一个默认的坐标系,其左上角为坐标原点(0,0),类似于数学坐标系的第四象限但x和y轴的值都是正值单位为像素点。若一个值为负值则此负符号一般表示逆向

三、绘制基本图形可以使用java.awt.geom几何包中的各种图形类中的内部静态类。其内部静态类的实例可以赋值给其所属的外嵌类的对象如:

  • 绘制直线:Line2D line=new Line2D.Double(double x1, double y1, double x2, double y2 );
  • 绘制矩形:new Rectangle2D.Double(double x, double y, double width, double height);
  • 绘制圆角矩形:new RoundRectangle2D.Double(double x, double y, double width, double hight, double 圆角长轴, double 圆角短轴);
  • 绘制椭圆:new Ellipse2D.Double(double x, double y, double width, double height);
  • 绘制圆弧:new Arc2D.Double(double x,double y, double width, double height, double 起始位置度数,double 旋转度数,int 圆弧类型);
  • 绘制文本:Graphics2D类的对象调用drawString(String str, double x, double y);
  • 绘制曲线: 二次曲线类似于“C”-----> new QuadCurve2D.Double(double 端点x, double 端点y, double 控制点x, double 控制点y, double 端点x2, double 端点y2 );  三次曲线类似于“S”----> new CubicCurve2D.Double(double 端点x1, double 端点y1, double 控制点x1, double 控制点y1, double 控制点x2, double 控制点y2, double 端点x2, double 端点y2 );
  • 绘制多边型:Polygon plgn=new Polygon(), plgn.addPoint(int x, int y);

四、使用AffineTransfrom类可以实现对图形的移动、收缩、旋转操作。其一般步骤如下:

①创建AffineTransfrom类的对象。

                     AffineTransfrom trans=new AffineTransfrom();

②trans对象可以调用以下方法实现对图形的变换。

  • 平移:translate(double x, double y)将图形X轴方向移动x个像素、Y轴方向移动y个像素。
  • 缩放:scale(double a, double b)将图形X轴方向缩放a倍,Y轴方向缩放b倍。
  • 旋转:rotate(double number, double x, double y)将图形沿着(x,y)点顺时针旋转number个弧度。

③把Graphics的对象g_2d设置成具有变换图形功能的画笔。

                        g_2d.setTransfrom(trans);

④使用Grapics类的对象g_2d绘制变换后的图形。

                          g_2d.draw(图形对象);

五、两个图形进行布尔运算后可以获得一个更加复杂的图形。假设T1和T2是两个图形:T1与T2得到的是两图形的重叠部分。T1或T2得到的是两图形的合并。T1差T2得到的是T1图形去除包含T2部分后的剩下的T1图形。T1异或T2得到的是两个图形非重叠部分。其一般步骤如下:

①先创建两个图形的Area区域对象

                  Area t1 = new Area(T1);

                  Area t2 = new Area(T2);

②将两个图形进行布尔运算获取新的图形如

                  t1.intersect(t2)------与

                  t1.add(t2)-------------或

                  t1.subtract(t2)--------差

                  t1.exclusiveOr(t2)----异或

③使用Grapics2D类的对象如:g_2d.draw(t1)或g_2d.fill(t1)来绘制或填充两图形运算后得到的新图形区域Area对象。

说明:使用repaint()方法可以重新绘制图形即JVM会在次调用paint()方法来重绘图形。

六、组件上可以显示图像。

方式一:

①首先使用Icon类的子类ImageIcon创建封装图片文件的ImageIcon类的对象如:Icon icon=new ImageIcon(“图片文件”)

②组件调用方法设置自身的图像如: button.setIcon(icon)。

方式二:

Java运行环境提供的有Toolkit类的对象,任何组件都可以使用getTookit()方法获取Tookit对象引用。用户使用Tookit对象的引用可以调用Image getImage(“图像文件名”)方法获取封装有图像的Image类的对象,之后用户就可以在paint()方法中使用Grapics2D类的对象调用其public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)方法实现在组件上绘制图像;其中observer是加载图像时的图像观察器,只要是实现ImageObserver接口的类创建的对象都可以作为图像观察器,Java中所有组件都实现了该接口故所有组件都可以作为图像观察器。

说明:JFrame主窗口类的对象可以使用setIconImage(Image img)方法设置主窗口左上角的图标图像。

七、用户可以使用javax.sound.sampled包中的Clip类的对象来播放音频,Clip对象是一个守护线程所以在其播放音频时,程序仍然可以做其它的事情。播放音频的步骤如下:

①创建音频文件File类的对象并使用AudioSystem.getAudioInputStream(file)方法获取音频文件字节输入流。如:File file = new File(“音频文件”); AudioInputStream stream = AudioSystem.getAudioInputStream(file)。

②获取Clip对象。如:Clip clip=AudioSystem.getClip()。

③打开音频流。如:clip.open(stream)。

④操作音频。如:

  • clip.start()-------播放音频
  • clip.stop()-------停止播放
  • clip.loop(int count)-------循环播放count次,负数表示无限循环播放

⑤关闭音频流。如:clip.close()。

注意:音频流一旦关闭如果想再次播放音频需要重新使用clip.open()方法打开音频流后在使用clip.start()方法播放音频。

@声明:“山月润无声”博主知识水平有限,以上文章如有不妥之处,欢迎广大IT爱好者指正,小弟定当虚心受教!

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Orion Guan's 山月润无声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值