• 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. rpm 命令介绍

    1. rpm 命令常用选项说明 1.1 功能模式选项 命令 解释 -i --install 安装软件,例:rpm -ivh tree-1.6.0-10.el7.x86_64.rpm -U --upgr ...

  2. Python数据分析入门(十):数据清洗和准备

    数据清洗是数据分析关键的一步,直接影响之后的处理工作 数据需要修改吗?有什么需要修改的吗?数据应该怎么调整才能适用于接下来的分析和挖掘? 是一个迭代的过程,实际项目中可能需要不止一次地执行这些清洗操作 ...

  3. 分库分表之后,id主键如何处理?

    (1)数据库自增id 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id.拿到这个id之后再往对应的分库分表里去写入. 这个方案 ...

  4. IDEA 配置文件位置

    1 IDEA 2020.1 以上 1.1 Win 语法: %APPDATA%\JetBrains\<product><version> Win上的APPDATA默认位置如下: ...

  5. poj_3617 解题

    题意: 给定长度为N的字符串S,要构造一个长度为N的字符串T串. 从S的头部删除一个字符,加到T的尾部 从S的尾部删除一个字符,加到T的尾部 目标是构造字典序尽可能小的字符串. 示例输入: ACDBC ...

  6. 深入探究ASP.NET Core读取Request.Body的正确方式

    前言 相信大家在使用ASP.NET Core进行开发的时候,肯定会涉及到读取Request.Body的场景,毕竟我们大部分的POST请求都是将数据存放到Http的Body当中.因为笔者日常开发所使用的 ...

  7. php自定义配置文件简单写法

    1 <?php 2 header("Content-type:text/html;charset=utf-8"); 3 4 $q = getconfig('rr'); 5 e ...

  8. MySql 按日,按周,按月 分组 统计数据

    知识关键词:DATE_FORMAT 按天统计: SELECT DATE_FORMAT(create_time,'%Y%m%d') days, COUNT(caseid) count FROM tc_c ...

  9. 日志配置文件读取spring boot配置文件中的属性

    如果是读取 application.properties 这种spring boot的默认配置文件时 其中 scope固定为context  指明从上下文中获取, name 根据自己的意思给, sou ...

  10. 【网络协议】 TCP三次握手的流程

    在TCP/IP协议中,TCP协议通过三次握手,建立可靠的连接服务: 三次握手是由客户端发起 第一步: 客户端向服务端发送请求报文(实际上就是一个具有特定格式的数据包),报文中包含一个标志为Syn,Sy ...