• 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编程基础 绘图的更多相关文章

  1. Java GUI编程中AWT/swing/SWT的优缺点

    http://www.cnblogs.com/dugang/archive/2010/10/22/1858478.html AWT AWT是Abstract Window Toolkit(抽象窗口工具 ...

  2. Java GUI编程4---标签组件JLabel

    Java GUI编程4---标签组件JLabel 2018年06月11日 22:06:58 蓝蓝223 阅读数 12103更多 个人分类: Java书籍摘抄 所属专栏: Java Swing图形界面 ...

  3. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  4. 如何夯实(Java)编程基础,并深入学习和提高

    如何夯实(Java)编程基础,并深入学习和提高? 240赞同反对,不会显示你的姓名 匿名用户 240 人赞同 多学习...网上自学的学习网站很多,见以下榜单~一.汇总榜单: 公开课_学习网站导航 收录 ...

  5. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  6. Java网络编程基础(Netty预备知识)

    今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...

  7. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  8. Java并发编程基础

    Java并发编程基础 1. 并发 1.1. 什么是并发? 并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互 ...

  9. JAVA学习(五):Java面向对象编程基础

    Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...

随机推荐

  1. 博文推荐|多图详解 Apache Pulsar 消息存储模型

    关于 Apache Pulsar Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息.存储.轻量化函数式计算为一体,采用计算与存储分离架构设计,支 ...

  2. C# List常用方法及Dictionary常用方法汇总

    本文主要汇总了在开发过程中,使用List和Dictionary常用的方法,例如增.删.改.查.排序等等各种常用操作. 在平时的开发过程中,List和Dictionary是我们经常使用到的数据结构,而且 ...

  3. java面试-G1垃圾收集器

    一.以前收集器的特点 年轻代和老年代是各自独立且连续的内存块 年轻代收集器使用 eden + S0 + S1 进行复制算法 老年代收集必须扫描整个老年代区域 都是以尽可能的少而快速地执行 GC 为设计 ...

  4. Vscode部分快捷键 Ps的简单使用 less中的除法问题 H5 四种布局

    vscode 部分快捷键 ctrl+/ 注释ctrl+回车 光标下移alt+shift+上下箭头 将本行代码向上或向下复制ul>li 自动写alt ,鼠标一直点,就会有很多光标,可以一起写ctr ...

  5. 宝塔linux7.4.2/windows6.8 的版本中的安全随笔

    在2020/8.23宝塔官方发布了一条关于宝塔linux7.4.2和Windows6.8版本中存在的重大的安全隐患 通知来源https://www.bt.cn/bbs/thread-54644-1-1 ...

  6. php中的一些没有用过的,但是见到过的方法 函数

    strlen(); strlen 和 mb_strlen 都是用于获取字符串长度的, 其中 strlen 只针对单字节编码字符,也就是说它计算的是 字符串的总字节数,如果是多字节编码,如 gbk 和 ...

  7. Java刷题-tree

    一.分别按照二叉树先序,中序和后序打印所有的节点. 这道题就是书上的算法思想的实际使用,唯一需要特别注意到的是用递归的方式建树,还是比较巧妙的,因为一棵树的建立过程字符流是重复使用的,用递归的方式对根 ...

  8. day-4 xctf-pwn CGfsb

    xctf-pwn CGfsb 传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id= ...

  9. Nuget-自定义模板的创建与使用

    参考官方文档: https://docs.microsoft.com/zh-cn/dotnet/core/tools/custom-templates https://devblogs.microso ...

  10. uni-app 微信小程序授权登录

    1.微信小程序 获取用户信息 与获取手机号 详细信息看官方公告:https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce8 ...