Java画圆技巧:圆形椭圆绘制全解析
时间:2025-06-24 09:42:47 378浏览 收藏
在文章实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Java画圆方法详解:圆形与椭圆绘制教程》,聊聊,希望可以帮助到正在努力赚钱的你。
在Java中绘制圆形和椭圆,1. 使用Graphics或Graphics2D类的drawOval()和fillOval()方法;2. 通过设置相同width和height绘制圆形;3. 控制圆形粗细使用BasicStroke类并调用setStroke()方法;4. 修改颜色使用setColor()方法;5. 绘制虚线圆形需定义dashPattern数组并传入BasicStroke构造函数;6. 动态调整大小需监听componentResized事件并重绘;7. 椭圆居中需根据窗口尺寸计算x和y坐标。
Java中绘制圆形和椭圆,主要依赖于Graphics
或Graphics2D
类提供的方法。核心是理解drawOval()
和fillOval()
这两个方法,它们实际上绘制的是一个矩形的内切椭圆,当矩形是正方形时,就变成了圆形。

绘制圆形和椭圆的核心在于理解Graphics
类中的drawOval(int x, int y, int width, int height)
和fillOval(int x, int y, int width, int height)
方法。x
和y
定义了椭圆外切矩形的左上角坐标,width
和height
则定义了矩形的宽度和高度。

绘制圆形,只需要保证width
和height
相等即可。
import javax.swing.*; import java.awt.*; public class DrawCircle extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 绘制圆形 int diameter = 100; // 直径 int x = 50; int y = 50; g2d.setColor(Color.RED); g2d.drawOval(x, y, diameter, diameter); // 绘制填充圆形 x = 200; g2d.setColor(Color.BLUE); g2d.fillOval(x, y, diameter, diameter); // 绘制椭圆 int width = 150; int height = 75; x = 50; y = 200; g2d.setColor(Color.GREEN); g2d.drawOval(x, y, width, height); // 绘制填充椭圆 x = 200; g2d.setColor(Color.YELLOW); g2d.fillOval(x, y, width, height); } public static void main(String[] args) { JFrame frame = new JFrame("Draw Circle and Oval"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new DrawCircle()); frame.setSize(400, 400); frame.setVisible(true); } }
如何控制圆形的粗细和颜色?
控制圆形的粗细和颜色主要通过Graphics2D
类实现。Graphics2D
是Graphics
的子类,提供了更强大的绘图功能,包括设置线条粗细(Stroke
)和颜色(Color
)。

import javax.swing.*; import java.awt.*; import java.awt.geom.Ellipse2D; public class DrawCircleThickness extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 设置线条粗细 Stroke stroke = new BasicStroke(5); // 5像素粗细 g2d.setStroke(stroke); // 设置颜色 g2d.setColor(Color.MAGENTA); // 绘制圆形 int diameter = 100; int x = 50; int y = 50; g2d.drawOval(x, y, diameter, diameter); // 绘制填充的,带粗细边框的圆形 g2d.setColor(Color.CYAN); g2d.fill(new Ellipse2D.Double(200, 50, diameter, diameter)); // 绘制椭圆 g2d.setColor(Color.ORANGE); int width = 150; int height = 75; x = 50; y = 200; g2d.drawOval(x, y, width, height); } public static void main(String[] args) { JFrame frame = new JFrame("Draw Circle with Thickness"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new DrawCircleThickness()); frame.setSize(400, 400); frame.setVisible(true); } }
这段代码展示了如何使用BasicStroke
来设置线条的粗细,以及如何使用setColor
来改变颜色。 注意这里使用了Ellipse2D.Double
来创建椭圆,然后使用g2d.fill()
来填充,可以更灵活地控制填充效果。
如何绘制虚线圆形?
绘制虚线圆形同样需要使用Graphics2D
类,关键在于使用BasicStroke
的构造函数来定义虚线的样式。BasicStroke
允许你指定虚线的线段长度、间隔长度等参数。
import javax.swing.*; import java.awt.*; import java.awt.geom.Ellipse2D; public class DrawDashedCircle extends JPanel { @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 定义虚线样式 float[] dashPattern = {10, 5, 2, 5}; // 实线长度10,间隔5,实线2,间隔5 BasicStroke dashedStroke = new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dashPattern, 0.0f); g2d.setStroke(dashedStroke); // 设置颜色 g2d.setColor(Color.DARK_GRAY); // 绘制虚线圆形 int diameter = 100; int x = 50; int y = 50; g2d.drawOval(x, y, diameter, diameter); // 绘制虚线椭圆 int width = 150; int height = 75; x = 200; y = 50; g2d.draw(new Ellipse2D.Double(x, y, width, height)); } public static void main(String[] args) { JFrame frame = new JFrame("Draw Dashed Circle"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new DrawDashedCircle()); frame.setSize(400, 400); frame.setVisible(true); } }
这里,dashPattern
数组定义了虚线的样式。数组中的值交替表示实线段的长度和空白段的长度。BasicStroke
的构造函数使用这个数组来创建虚线笔触。
如何在Java Swing中创建一个可以动态调整大小的圆形?
创建一个可以动态调整大小的圆形,需要监听组件的大小改变事件,并根据新的尺寸重新计算圆形的位置和大小。
import javax.swing.*; import java.awt.*; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; public class ResizableCircle extends JPanel { private int diameter; private int x; private int y; public ResizableCircle() { addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { // 组件大小改变时,重新计算圆形的大小和位置 int width = getWidth(); int height = getHeight(); diameter = Math.min(width, height) - 20; // 留出一些边距 x = (width - diameter) / 2; y = (height - diameter) / 2; repaint(); // 重新绘制 } }); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 设置颜色 g2d.setColor(Color.GREEN); // 绘制圆形 g2d.drawOval(x, y, diameter, diameter); } public static void main(String[] args) { JFrame frame = new JFrame("Resizable Circle"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new ResizableCircle()); frame.setSize(300, 300); frame.setVisible(true); } }
这段代码的关键在于ComponentAdapter
的使用。componentResized
方法会在组件大小改变时被调用,我们在这个方法中重新计算圆形的大小和位置,并调用repaint()
方法来触发重绘。 Math.min(width, height)
确保圆形始终位于组件的内部,并且是适应最小尺寸的正方形。
绘制椭圆时,如何让椭圆始终保持在窗口中心?
要使椭圆始终保持在窗口中心,需要根据窗口的大小动态计算椭圆的坐标。
import javax.swing.*; import java.awt.*; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; public class CenteredOval extends JPanel { private int width; private int height; private int x; private int y; public CenteredOval() { addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { // 组件大小改变时,重新计算椭圆的位置 int panelWidth = getWidth(); int panelHeight = getHeight(); // 椭圆的宽度和高度可以固定,也可以根据窗口大小动态调整 width = panelWidth / 3; // 宽度为窗口的1/3 height = panelHeight / 4; // 高度为窗口的1/4 x = (panelWidth - width) / 2; y = (panelHeight - height) / 2; repaint(); // 重新绘制 } }); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; // 设置颜色 g2d.setColor(Color.BLUE); // 绘制椭圆 g2d.drawOval(x, y, width, height); } public static void main(String[] args) { JFrame frame = new JFrame("Centered Oval"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new CenteredOval()); frame.setSize(400, 300); frame.setVisible(true); } }
关键在于componentResized
方法中,我们获取了面板的宽度和高度,然后计算出椭圆的左上角坐标,使其位于面板的中心。 椭圆的宽度和高度可以根据需求进行调整,这里设置为面板宽度和高度的1/3和1/4,确保椭圆不会超出窗口边界。
好了,本文到此结束,带大家了解了《Java画圆技巧:圆形椭圆绘制全解析》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
184 收藏
-
209 收藏
-
369 收藏
-
469 收藏
-
423 收藏
-
240 收藏
-
443 收藏
-
419 收藏
-
460 收藏
-
172 收藏
-
459 收藏
-
271 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习