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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派更新源,以及安装wiringPi库

1、更换树莓派(Raspberry Pi 3B)软件源 更换树莓派(Raspberry Pi 3B)软件源为国内镜像源_树莓派3b更换国内源-CSDN博客 2、安装wiringPi库 安装wiringPi库在树莓派上,可以按照以下步骤进行操作: a.首先&…

十四届蓝桥杯国赛考试计算思维 U10 组真题和答案

答案在底部 第一题 恐龙乐园的规划图中有 n 个小岛,m 座小桥,每座桥连接两个小岛。 下图是 n=5,m=8 的一个例子: 希希发现,如果拆除一些桥,仍然能使任何两个小岛都互通。最多可以拆除( )座 桥。 A. n-m B. m-n C. m-m-1 D. m-n+1 第二题

Python文件和异常(一)

目录 一、从文件中读取数据 (一)读取整个文件 (二)文件路径 (三)逐行读取 (四)创建一个包含文件各行内容的列表 (五)使用文件的内容 (六&a…

私域运营的4个核心要素

第一,我们要首先理解私域现在的形势。 以前私域:崛起的微商。发朋友圈,成交率高。 因为主要来源是信息差。 当代:信息透明化。私域流量运营的本质是获取信任。通过建立起泛人脉亲密关系。信任才重要。 第二,塑造一对一…

探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换 文章目录 一、案例…

VUE3使用three.js显示3D模型

使用3D模型作为自动化系统的界面已经成为潮流。尽管在AutomationML 中推荐COLLADA作为 3D 模型的标准。但是COLLADA的开发者khronos 集团却已经开发了COLLADA的后继者glTF 。glTF 2.0已经成为国际标准ISO/IEC 12113:2022。 Khronos声称-‘glTF是3D里的JPEG’。目前看来glTF 更加…

Java WEB面试系列-01

1. 什么是 Servlet? Servlet是用Java编写的服务器端程序, 其主要功能在于交互式地浏览和修改数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,我们一般将Servlet理解为后者。 2. 为什么要使…

问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案

起因 在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统,上面三个函数会被频繁的触发&am…

ERC721解读

NFT(非同质化代币):类似于明朝、宋朝的青花瓷。虽然都是青花瓷。但是都具有唯一的典藏价值。而且价值可能不同。 NFT就是具有唯一价值的代币。 ERC721: 是以太坊规定实现NFT的一种标准了。实现ERC21标准的智能合约就是NFT代币了。 1.接口 1.ERC721 定义接口参考:ER…

vue.js中slot插槽的作用

作为一种流行的JavaScript框架,vue.js提供了很多功能强大的特性,其中之一就是插槽(slot)。插槽是一种能够让父组件向子组件传递内容的机制,它为我们构建可复用的组件提供了更大的灵活性和可扩展性。以下介绍Vue中插槽的…

《Docker极简教程》--Docker服务管理和监控--Docker服务的监控

Docker监控的必要性在于确保容器化环境的稳定性、性能和安全性。以下是几个关键原因: 性能优化和故障排除:监控可以帮助识别容器化应用程序的性能问题,并快速进行故障排除。通过监控关键指标,如CPU利用率、内存使用、网络流量等&…

ElementUI table表格组件实现双击编辑单元格失去焦点还原,支持多单元格

在使用ElementUI table表格组件时有时需要双击单元格显示编辑状态,失去焦点时还原表格显示。 实现思路: 在数据中增加isFocus:false.控制是否显示在table中用cell-dblclick双击方法 先看效果: 上源码:在表格模板中用scope.row…

springboot集成mqtt

文章目录 前言一、MQTT是什么?二、继承步骤1.安装MQTT2.创建项目,引入依赖3. 对应步骤2的代码3 测试 总结mqtt 启动后访问地址 前言 随着物联网的火热,MQTT的应用逐渐增多 曾经也有幸使用过mqtt,今天正好总结下MQTT的使用; 一、MQTT是什么?…

从扩散模型基础到DIT

Diffusion model 扩散模型如何工作? 输入随机噪声和文本内容,通过多次预测并去除图片中的噪声后,最终生成清晰的图像。 以上左边这张图,刚开始是随机噪声,999为时间序列。 为什么不直接预测下一张图片呢?…

springboot+vue的宠物咖啡馆平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

《卓有成效的管理者》

前言 管理工作在很大程度上是要言传身教的,如果管理者不懂得如何在自己的工作中做到卓有成效,就会给其他人树立错误的榜样。 第 1 章 卓有成效是可以学习的 关于体力工作,我们已有一套完整的衡量方法和制度,从工程设计到质量控制…

Java中常用的类(一)

一、API应用程序编程接口: API:指的是官方给开发人员提供的一个说明文档,对于语言有哪些类,类中有哪些方法进行说明 二、Object类 Object是java中所有类的父类,体系结构中最顶层的类,位置是java.lang.Ob…

【深度学习笔记】3_4 逻辑回归之softmax-regression

3.4 softmax回归 Softmax回归(Softmax Regression),也称为多类逻辑回归(Multinomial Logistic Regression),是一种用于多分类问题的分类算法。虽然名字里面带回归,实际上是分类。 前几节介绍的…

Socks5代理与代理IP的应用

在全球化的背景下,跨界电商和游戏行业正经历着蓬勃发展的时代。然而,随之而来的网络安全挑战也日益突出。为了应对这些挑战,Socks5代理与代理IP等技术成为了保障网络安全的重要工具。本文将探讨这些技术在跨界电商和游戏行业中的应用&#xf…

Python模块百科_时间的访问和转换(time)_下

TOC 一、概述 time模块提供了各种与时间相关的函数。相关功能还可以参阅datetime 和 calendar模块。 尽管所有平台皆可引用此模块,但模块内的函数并不是所有平台都可用。此模块中定义的大多数函数的实现都是调用其所在平台的C语言库的同名函数。因为这些函数的语义…