[Java] GUI编程基础 绘图
库
- swing
- awt
过程
- 创建窗口JFrame
- JFrame-->MenuBar-->Container

- 屏幕坐标系:左上角为原点
- Graphics2D

Main.java
1 import java.awt.EventQueue;
2 import javax.swing.JFrame;
3
4 public class Main {
5 public static void main(String[] args) {
6 EventQueue.invokeLater(()->{
7 AlgoFrame frame = new AlgoFrame("Welcome",500,500);
8 //AlgoFrame frame = new AlgoFrame("Welcome");
9 });
10 }
11 }
AlgoFrame.java
1 import java.awt.Dimension;
2 import java.awt.Graphics;
3 import javax.swing.JFrame;
4 import javax.swing.JPanel;
5
6 public class AlgoFrame extends JFrame{
7 private int canvasWidth;
8 private int canvasHeight;
9
10 public AlgoFrame(String title, int canvasWidth, int canvasHeight) {
11 super(title);
12
13 this.canvasWidth = canvasWidth;
14 this.canvasHeight = canvasHeight;
15
16 AlgoCanvas canvas = new AlgoCanvas();
17 setContentPane(canvas);
18 pack();
19
20 setResizable(false);
21 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
22 setVisible(true);
23 }
24
25 public AlgoFrame(String title) {
26 this(title, 1024, 768);
27 }
28
29 public int getCanvasWidth() {return canvasWidth;}
30 public int getCanvasHeight() {return canvasHeight;}
31
32 private class AlgoCanvas extends JPanel{
33 @Override
34 public void paintComponent(Graphics g) {
35 super.paintComponent(g);
36 g.drawOval(50, 50, 300, 300);
37 }
38 @Override
39 public Dimension getPreferredSize() {
40 return new Dimension(canvasWidth, canvasHeight);
41 }
42 }
43 }

绘制实心、有颜色的圆形
AlgoFrame.java
1 import java.awt.BasicStroke;
2 import java.awt.Color;
3 import java.awt.Dimension;
4 import java.awt.Graphics;
5 import java.awt.Graphics2D;
6 import java.awt.geom.Ellipse2D;
7
8 import javax.swing.JFrame;
9 import javax.swing.JPanel;
10
11 public class AlgoFrame extends JFrame{
12 private int canvasWidth;
13 private int canvasHeight;
14
15 public AlgoFrame(String title, int canvasWidth, int canvasHeight) {
16 super(title);
17
18 this.canvasWidth = canvasWidth;
19 this.canvasHeight = canvasHeight;
20
21 AlgoCanvas canvas = new AlgoCanvas();
22 setContentPane(canvas);
23 pack();
24
25 setResizable(false);
26 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
27 setVisible(true);
28 }
29
30 public AlgoFrame(String title) {
31 this(title, 1024, 768);
32 }
33
34 public int getCanvasWidth() {return canvasWidth;}
35 public int getCanvasHeight() {return canvasHeight;}
36
37 private class AlgoCanvas extends JPanel{
38
39 @Override
40 public void paintComponent(Graphics g) {
41
42 super.paintComponent(g);
43
44 Graphics2D g2d = (Graphics2D)g;
45
46 int strokeWidth = 5;
47 g2d.setStroke(new BasicStroke(strokeWidth));
48
49 g2d.setColor(Color.RED);
50 Ellipse2D circle = new Ellipse2D.Float(50,50,300,300);
51 g2d.draw(circle);
52
53 g2d.setColor(Color.BLUE);
54 Ellipse2D circle2 = new Ellipse2D.Double(50,50,300,300);
55 g2d.fill(circle2);
56 }
57 @Override
58 public Dimension getPreferredSize() {
59 return new Dimension(canvasWidth, canvasHeight);
60 }
61 }
62 }

优化代码
- 将基本操作抽象为函数
- 创建工具类,把“绘制的工具”和“绘制的内容”分开
AlgoVisHelper.java
1 import java.awt.BasicStroke;
2 import java.awt.Color;
3 import java.awt.Graphics2D;
4 import java.awt.geom.Ellipse2D;
5
6 public class AlgoVisHelper {
7 public AlgoVisHelper() {}
8 public static void setStrokeWidth(Graphics2D g2d, int w) {
9 int strokeWidth = w;
10 g2d.setStroke(new BasicStroke(strokeWidth, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
11 }
12 public static void setColor(Graphics2D g2d, Color color) {
13 g2d.setColor(color);
14 }
15 public static void strokeCircle(Graphics2D g2d, int x, int y, int r) {
16 Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);
17 g2d.draw(circle);
18 }
19 public static void fillCircle(Graphics2D g2d, int x, int y, int r) {
20 Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);
21 g2d.fill(circle);
22 }
23 }
抗锯齿(Anti-Aliased)
- 用不同的灰度渲染边缘
- 框架学习的关键:是否知道(勤查文档)
双缓存(Double-Buffered)
- 单缓存的问题:动画中图形位置的刷新导致闪烁(画布清空)
- 如何解决:用两块画布
- JPanel 支持双缓存
AlgoFrame.java
1 import java.awt.Color;
2 import java.awt.Dimension;
3 import java.awt.Graphics;
4 import java.awt.Graphics2D;
5 import java.awt.RenderingHints;
6
7 import javax.swing.JFrame;
8 import javax.swing.JPanel;
9
10 public class AlgoFrame extends JFrame{
11 private int canvasWidth;
12 private int canvasHeight;
13
14 public AlgoFrame(String title, int canvasWidth, int canvasHeight) {
15 super(title);
16
17 this.canvasWidth = canvasWidth;
18 this.canvasHeight = canvasHeight;
19
20 AlgoCanvas canvas = new AlgoCanvas();
21 setContentPane(canvas);
22 pack();
23
24 setResizable(false);
25 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
26 setVisible(true);
27 }
28
29 public AlgoFrame(String title) {
30 this(title, 1024, 768);
31 }
32
33 public int getCanvasWidth() {return canvasWidth;}
34 public int getCanvasHeight() {return canvasHeight;}
35
36 private class AlgoCanvas extends JPanel{
37
38 public AlgoCanvas() {
39 super(true);
40 }
41
42 @Override
43 public void paintComponent(Graphics g) {
44
45 super.paintComponent(g);
46
47 Graphics2D g2d = (Graphics2D)g;
48
49 //抗锯齿
50 RenderingHints hints = new RenderingHints(
51 RenderingHints.KEY_ANTIALIASING,
52 RenderingHints.VALUE_ANTIALIAS_ON);
53 g2d.addRenderingHints(hints);
54
55 //具体绘制
56 AlgoVisHelper.setStrokeWidth(g2d, 5);
57
58 AlgoVisHelper.setColor(g2d,Color.BLUE);
59 AlgoVisHelper.fillCircle(g2d, canvasWidth/2, canvasHeight/2, 200);
60
61 AlgoVisHelper.setColor(g2d,Color.RED);
62 AlgoVisHelper.strokeCircle(g2d, canvasWidth/2, canvasHeight/2, 200);
63 }
64 @Override
65 public Dimension getPreferredSize() {
66 return new Dimension(canvasWidth, canvasHeight);
67 }
68 }
69 }

[Java] GUI编程基础 绘图的更多相关文章
- Java GUI编程中AWT/swing/SWT的优缺点
http://www.cnblogs.com/dugang/archive/2010/10/22/1858478.html AWT AWT是Abstract Window Toolkit(抽象窗口工具 ...
- Java GUI编程4---标签组件JLabel
Java GUI编程4---标签组件JLabel 2018年06月11日 22:06:58 蓝蓝223 阅读数 12103更多 个人分类: Java书籍摘抄 所属专栏: Java Swing图形界面 ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- 如何夯实(Java)编程基础,并深入学习和提高
如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...
- Java面向对象编程基础
一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...
- Java网络编程基础(Netty预备知识)
今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- Java并发编程基础
Java并发编程基础 1. 并发 1.1. 什么是并发? 并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互 ...
- JAVA学习(五):Java面向对象编程基础
Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...
随机推荐
- 解决“用PicGo-2.3.0-beta5 + GitHub做博客图床,github仓库图片文件不显示”的问题记录(备忘)
解决"用PicGo-2.3.0-beta5 + GitHub做博客图床,github仓库图片文件不显示"的问题记录(备忘) 历时几个小时百度,终于靠自己理解解决了GitHub仓库图 ...
- [Fundamental of Power Electronics]-PART II-7. 交流等效电路建模-7.5 状态空间平均 7.6 本章小结
7.5 状态空间平均 现有文献中已经出现了很多变换器交流建模的方法,其中包括电流注入法,电路平均和状态空间平均法.尽管某种特定方法的支持者可能更愿意使用该方法去建模,但所有方法的最终结果都是等效的.并 ...
- C#补位函数PadLeft和PadRight
左边补位 PadLeft 用法: string str = "100"; str.PadLeft(5,'0') 输出:00100 右边补位 PadRight 用法: str.Pad ...
- 如何调试 Java 开源项目源码,记一种源码导入开发工具并调试的通用方法
楔子 说起读开源项目源码,很多朋友觉得高大上.大佬牛逼,云云~ 挡在很多人面前的不是源码怎么读,而是不知道如何导入源码到开发工具以及如何调试源码. 本文将以 spring-cloud-gateway ...
- MzzTxx——团队介绍
项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-团队介绍 我在这个课程的目标是 提升工程能力和团队意识,熟悉软件开发的流程 这个作业在哪 ...
- 下载kaggle数据集的小妙招
kaggle是很多数据分析和机器学习初学者非常喜爱的数据科学竞赛平台. 这个平台上有很多接近现实业务场景的数据集,非常适合练手. 今天向大家推荐一个下载kaggle数据集的小工具--kaggleAPI ...
- SQL Server 实用语句
创建临时表 #Test CREATE TABLE #Test( ID INT, Name VARCHAR(50) ) INSERT INTO #Test( ID, Name ) VALUES ( 1, ...
- Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(五):鉴权 gRPC-Interceptor 拦截器实战
拦截器(gRPC-Interceptor)类似于 Gin 中间件(Middleware),让你在真正调用 RPC 服务前,进行身份认证.参数校验.限流等通用操作. 系列 云原生 API 网关,gRPC ...
- Proxy.newProxyInstance源码探究
JDK动态代理案例实现:实现 InvocationHandler 接口重写 invoke 方法,其中包含一个对象变量和提供一个包含对象的构造方法: public class MyInvocationH ...
- .NET6 平台系列3 .NET CLR 详解
系列目录 [已更新最新开发文章,点击查看详细] CLR 简介 运行时(Runtime Environment,简称Runtime ),是指那些支持在特定的平台上,用于运行特定编程语言编写的软件 ...