[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)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...
随机推荐
- 基于SageMath的数学网站——本科毕业开发项目
1 绪论 1.1研究背景 我国是一个拥有15亿人口的大国.其中,据2017年的统计,全国共有大学生2600万左右.如此数量众多的大学生,都会有着学习基础数理课程的需求.而在高校的数学教学中,教授最多最 ...
- IDEA 主题下载
IDEA中主题可以更换,大家可以直接到 http://www.riaway.com/ 网站或 http://color-themes.com/?view=index 网站,直接下载自己喜欢的主题. ...
- Android创建自定义Application
开发目的 创建一个自定义的MainApplication继承Application. 读取AndroidManifest.xml文件中Application节点的META-DATA数据.此处以ApiK ...
- spring-cloud-oauth2 认证授权
什么是OAuth2? OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该令牌在限定时间. ...
- Bounding Volume Hierarchies 加速结构
背景 光线与物体求交是光线追踪的主要时间瓶颈. 如果不进行优化,则对每条光线,我们都需要遍历场景中的全部物体并求交.而现在想建模一个小物体的表面,往往要几千甚至几万个三角形,一个商业级产品,屏 ...
- kube-batch(一)安装
安装 官方:https://github.com/kubernetes-sigs/kube-batch 下载镜像 安装 官方:https://github.com/kubernetes-sigs/ku ...
- matlab帮助文档
matlab的纯文本帮助命令有多种,help.lookfor.which.doc.get.type等 help命令 help命令用来查询一个函数的使用方式. help fun %fun是函数名称 ...
- ZOJ 3736 模拟魔方
题意: 2*2*2的魔方,给你一个初始状态,和一个限定步数,问你在这么多步数条件下最多能有多少面拼好,(不是累加关系,是某一个状态的最多,最多是6); 思路: 最多是7步,所以直 ...
- 从苏宁电器到卡巴斯基第30篇:难忘的三年硕士时光 VIII
自给自足 临近毕业答辩,别的导师的学生基本上都完成了各自的论文,也都开始交由第三方进行审核.而我们导师由于情况特殊,还没有机会看我们的论文,所以我们也打算和老师约一个时间,来给我们的论文提点意见,修改 ...
- LA3027简单带权并查集
题意: 有n个点,一开始大家都是独立的点,然后给出一些关系,a,b表示a是b的父亲节点,距离是abs(a-b)%1000,然后有一些询问,每次询问一个节点a到父亲节点的距离是多少? 思路: ...