• 【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爱好者指正,小弟定当虚心受教!

  • 相关阅读:
    第三章 shell条件测试
    怎么把旧电脑的用户配置文件迁移到新电脑
    Mysql —— “子查询”内容上的打字练习
    解决bootstrap模态框拖动头部区域,拖出边界,拖不回来
    gd407使用dm9000通讯异常
    学习操作系统之分时系统+时间片
    商城小程序项目完整源码(微信小程序)
    带你掌握Redis中的数据类型
    《QT实用小工具·六十九》基于QT开发的五子棋AI游戏
    webstrom 插件开发(一)
  • 原文地址:https://blog.csdn.net/qq_60243891/article/details/136274858