《Java核心技术 卷I》Swing处理2D图形

处理2D图形

Java1.0开始,Graphics类就包含绘制直线、矩形和椭圆等方法,但是绘制图形的操作能力有限,我们将使用Java2D的图形库。想绘制需要获得Graphics2D类的一个对象,是Graphics的子类。paintCompoent方法接收一个2D类对象,并强制转换。

Java2D库采用面向对象的方式组织几何图形,提供了直线,矩形,椭圆的类:

Line2D,Rectangle2D,Ellipse2D,都实现了Shape接口,调用draw方法绘制。

Java2D库针对像素,采用浮点坐标,而不是整数坐标,内部计算采用单精度float。

涉及到加f后缀和将double强转,都有点麻烦,设计者提供了两个版本:

  • 节省空间版本,用float坐标
  • 为懒惰程序员提供的版本,使用double类型的坐标(本书采用这种)

用法类似于,new Rectangle2D.Float或new Rectangle2D.Double

构造点也是,Point2D.Float和Point2D.Double

椭圆也继承一个矩形类,是椭圆的外界矩形。

图形类之间的关系

Rectangle2D和Ellipse2D队形很容易构造,需要指定:

  • 左上角的x和y坐标
  • 宽和高

对于椭圆,表示外界矩形:

var e = new Ellipse2D.Double(150,200,100,50);//左上角坐标150,200,宽100、高50

通过中心点构造椭圆:

var ellipse = new Ellipse2D.Double(centerX-width /2,centyY-height/2,width,height);

构造直线需要起点和终点

案例:绘制几何图形

package draw;import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;import javax.swing.JComponent;
import javax.swing.JFrame;public class DrawTest {public static void main(String[] args) {EventQueue.invokeLater(() -> {var frame = new DrawFrame();frame.setTitle("DrawTest");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}}class DrawFrame extends JFrame {public DrawFrame() {add(new DrawComponent());pack();}
}class DrawComponent extends JComponent {private static final int DEFAULT_WIDTH = 400;private static final int DEFAULT_HEIGHT = 400;@Overrideprotected void paintComponent(Graphics g) {var g2 = (Graphics2D)g;//画一个矩形double leftX = 100;double topY = 100;double width = 200;double height = 150;var rect = new Rectangle2D.Double(leftX, topY, width, height);g2.draw(rect);//画一个椭圆var ellipse = new Ellipse2D.Double(leftX, topY, width, height);g2.draw(ellipse);//画一个和外接矩形相同的圆心的圆double centerX = rect.getCenterX();double centerY = rect.getCenterY();double radius = 150;var circle = new Ellipse2D.Double();circle.setFrameFromCenter(centerX, centerY, centerX+radius, centerY+radius);g2.draw(circle);}@Overridepublic Dimension getPreferredSize() {return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);}}

效果:

java.awt.geom.RectangularShape 1.2

  • double getCenterX()
  • double getCenterY()
  • double getMinX()
  • double getMinY()
  • double getMaxX()
  • double getMaxY(),返回闭合矩形的中心,以及最小、最大x和y坐标值。
  • double getWidth()
  • double getHeight(),返回闭合矩形的宽和高
  • double getX()
  • double getY(),返回闭合矩形左上角的x和y坐标

java.awt.geom.Rectangle2D.Double 1.2

  • Rectangle2D.Double(double x,double y, double w,double h),利用给定的左上角、宽和高,构造一个矩形。

java.awt.geom.Ellipse2D.Double 1.2

  • Ellipse2D.Double(double x,double y,double w,double h),利用有给定左上角、宽和高的外接矩形,构造一个椭圆。

java.awt.geom.Point2D.Double 1.2

  • Point2D.Double(double x,double y),利用给定坐标构造一个点

java.awt.geom.Line2D.Double 1.2

  • Line2D.Double(Point2D start,Point2D end)
  • Line2D.Double(double startX,double startY,double endX,double endY),使用给定的起点和终点,构造一条直线。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:客户端工具创建数据库

MySQL 是一个开源的关系型数据库管理系统(RDBMS),用于存储、管理和检索数据。MySQL是基于SQL语言的,它具有高效、可靠、易用的特点。 客户端工具 这个mysqld.exe就在计算机安装的数据可服务,启动之后,mys…

【Python】计算机视觉应用:OpenCV库图像处理入门

计算机视觉应用:OpenCV库图像处理入门 在当今的数字化时代,计算机视觉(Computer Vision)已经渗透到各行各业,比如自动驾驶、智能监控、医疗影像分析等。而 Python 的 OpenCV 库(Open Source Computer Visi…

万字长文详解JavaScript基础语法--前端--前端样式--JavaWeb

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 今天毛毛张带来的前端教程的第三期:JavaScript 文章目录 4.JavaScript4.1 JS简介4.1.1 JS起源4.1.2 JS 组成部分4.1.3 JS的引入方式 4.2 JS的数据类型和运…

医学图像算法之基于Unet的视网膜血管分割

第一步:准备数据 视网膜血管分割数据比较少,但效果好,总共40张 第二步:搭建模型 UNet主要贡献是在U型结构上,该结构可以使它使用更少的训练图片的同时,且分割的准确度也不会差,UNet的网络结构…

深度剖析JUC中LongAdder类源码

文章目录 1.诞生背景2.LongAdder核心思想3.底层实现:4.额外补充 1.诞生背景 LongAdder是JDK8新增的一个原子操作类,和AtomicLong扮演者同样的角色,由于采用AtomicLong 保证多线程数据同步,高并发场景下会导致大量线程同时竞争更新…

Python(PySimpleGUI 库)

PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控…

LangChain学习心得总结

大模型开发遇到的问题及langchain框架学习 背景: 1、微场景间跳转问题,无法实现微场景随意穿插 2、大模型幻读(推荐不存在的产品、自己发挥) 3、知识库检索,语义匹配效果较差,匹配出的结果和客户表述的…

Linux基础(十二)——文件与文件系统的压缩、打包和备份

文件与文件系统的压缩、打包和备份 1.压缩1.1 压缩方法及其后缀1.2 gzip1.3 bzip21.4 xz 2.打包3.XFS文件系统备份与还原4.镜像文件创建(mkisofs) 1.压缩 1.1 压缩方法及其后缀 我们知道在 Linux 下面的扩展名是没有什么很特殊的意义的, 不…

简简单单的UDP

前言 上一篇了解了TCP的三次握手过程,目的、以及如何保证可靠性、序列号与ACK的作用,最后离开的时候四次挥手的内容,这还只是TCP内容中的冰山一角,是不是觉得TCP这个协议非常复杂,这一篇我们来了解下传输层另外一个协…

MLMs之OmniGen:OmniGen(统一图像生成模型)的简介、安装和使用方法、案例应用之详细攻略

MLMs之OmniGen:OmniGen(统一图像生成模型)的简介、安装和使用方法、案例应用之详细攻略 导读:这篇论文介绍了OmniGen,一个用于统一图像生成的扩散模型。论文的核心要点可以总结如下: >> 背景痛点: ● 图像生成领…

LeetCode 143.重排链表

题目: 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际…

Linux进程信号(信号的产生)

目录 什么是信号? 信号的产生 信号产生方式1:键盘 前台进程 后台进程 查看信号 signal系统调用 案例 理解进程记录信号 软件层面 硬件层面 信号产生方式2:指令 信号产生方式3:系统调用 kill系统调用 案例 其他产生信号的函数调用 1.rais…

【C++】STL— stack的常见用法和模拟实现

目录 1、stack的介绍 2、stack的使用 构造一个空栈 stack的简单接口应用 3、stack的模拟实现 4、栈的相关题目 4.1 最小栈 4.1.2思路 4.1.3 实现代码 4.2 栈的压入、弹出序列 4.2.2 思路 4.2.3程序实现 1、stack的介绍 在C中,stack是一种标准模板库&am…

神书《从零构建大模型》分享,尚未发布,GitHub标星22k!!

《从零构建大模型》是一本即将于今年10月底发布的书籍,github已经吸引了惊人的21.7k标星!作者是威斯康星大学麦迪逊分校的终身教授,在GitHub、油管、X上拥有大量粉丝,是一位真正的大佬。 本书免费获取地址 在本书中&#xff0…

【深度学习目标检测|YOLO算法2】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析...

【深度学习目标检测|YOLO算法2】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析… 【深度学习目标检测|YOLO算法2】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析… 文章目录 【深度学习目标检测|YOL…

动态避障-图扑自动寻路 3D 可视化

自动寻路是机器人导航的核心技术,其原理主要涉及机器人与环境之间的复杂信息交互与处理。在自动寻路过程中,机器人依靠先进的传感器系统,如高清摄像头、精密激光雷达和灵敏超声波装置,全方位感知周围环境。这些传感器能够实时捕捉…

Docker 镜像拉不动?自建 Docker Hub 加速站 解决镜像拉取失败

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 众所周知,6 月份的时候,Docker Hub 的镜像就已经无法正常拉取,那会随手用 Nginx 反代了一下 Docker Hub,建了个自用的镜像站,一直用到了 9 月份&…

RabbitMQ集群搭建

RabbitMQ集群搭建 1、RabbitMQ集群1.1、默认集群模式1.1.1、为什么集群不复制队列内容和状态到所有节点? 1.2、镜像集群模式 2、默认集群模式安装前准备2.1、准备3台机器2.2、启动三台机器2.3、使用xshell 连接三台机器2.4、服务器安装erlang和RabbitMQ2.5、修改三台机器的/et…

mysql-springboot netty-flink-kafka-spark(paimon)-minio

1、下载spark源码并编译 mkdir -p /home/bigdata && cd /home/bigdata wget https://archive.apache.org/dist/spark/spark-3.4.3/spark-3.4.3.tgz 解压文件 tar -zxf spark-3.4.3.tgz cd spark-3.4.3 wget https://raw.githubusercontent.com/apache/incubator-celeb…

系统安全第七次作业题目及答案

一、 1.RBAC0 RBAC1 RBAC2 RBAC3 2.属性 身份标识 3.接入访问控制 资源访问控制 网络端口和节点的访问控制 二、 1.B 2.A 3.ABE 4.BCD 5.ABC 三、 1. 答:基于属性的访问控制(ABAC)是通过对实体属性添加约束策略的方式实现主、客体之…