• 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. 如何使用Topshelf与.NET泛型主机建立Windows服务

    1 前置阅读 在阅读本文章之前,你可以先阅读: Topshelf一个用于使用.NET构建Windows服务框架 2 使用 2.1 创建应用程序 首先,创建一个新的控制台应用程序并从nuget获取Top ...

  2. 文件查找工具 find 详解(附:生产示例)

    1. 文件查找:在文件系统上查找符合条件的文件 命令 解释 which 查看可执行文件的位置,只能寻找执行文件,并在PATH变量里面寻找 whereis 查看文件的位置:只能查二进制文件,说明文档,源 ...

  3. Chrome最新0day RCE(2021/4/13)

    关于Chrome Chrome就是Google浏览器... POC Git链接 https://github.com/r4j0x00/exploits/tree/master/chrome-0day ...

  4. 构建一个Flowable命令行应用

    官网链接 [(https://flowable.com/open-source/docs/bpmn/ch02-GettingStarted/#building-a-command-line-appli ...

  5. 详解DNS重绑定攻击

    0x00 前言 DNS重绑定攻击的用法有很多种,这篇文章主要理解DNS重绑定攻击的原理,并介绍如何通过DNS重绑定来攻击内网设备.为了更好的理解DNS重绑定攻击,我们先从Web浏览器的同源策略开始介绍 ...

  6. shell 使用 cat 配合 EOF 创建文件并写入多行内容

    之前折腾 GtiHub Actions 想实现提交 issue 后将 issue 的内容生成一个 Markdown 文件提交到仓库,从而实现自动发布到 GitHub Pages 的目的.倒是有一些现成 ...

  7. JVM学习笔记(三):JVM基本参数

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第三章 本文是第三章的一些笔记整理. 2 GC日志:-Xlog:gc 要打印GC日志的话,可以加上-Xlog: ...

  8. 6. Mybatis resultMap

    resultMap 元素是MyBatis中最重要最强大的元素.它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那东西,而且在一些情形下允许你做一些JDBC不支持的事情.事实上,编写相似于对 ...

  9. Salesforce学习之路(九)Org的命名空间

    1. 命名空间的适用场景 每个组件都是命名空间的一部分,如果Org中设置了命名空间前缀,那么需使用该命名空间访问组件.否则,使用默认命名空间访问组件,系统默认的命名空间为"c". ...

  10. Printer Queue UVA - 12100

    The only printer in the computer science students' union is experiencing an extremely heavy workload ...