Graphics画布

Graphics 应该算是AWT时代的产物, 但是基本的思想很值得学习.
学习 Graphics 可以分为作为以下几种用途

  • 用 Graphics 来修改默认的UI组件样式, 那么你可以轻松实现圆形按钮,椭圆按钮 ,徽章 等等h5中常见的UI风格
  • 用Graphics来实现图表, 如果h5没有echarts threejs 你也需要去学习2D 或3D的画图, 但是swing可能也有一些框架jfreechart JGraphT等,所以重点学习的应该是画布的思维方式
  • Graphics在游戏中可能更偏重一些,比如你想开发一个五子棋游戏. 当然如果用PS进行切图 也可以实现底图的绘制, 只是性能和UI 你更喜欢哪种的问题

Graphics可以与h5的canvas来作为对比去理解.

使用 Graphics绘制常见的图形

PS

记住画图最重要的一些元素,

  • 坐标系与 原点
  • 点的 x轴坐标 y轴坐标, 点与点之间可以形成的一些 隐藏知识正弦 余弦 正切 余切 ,
  • 面与面之间的交集 差集 补集 全集
  • 线的长度 位置 角度 等等

代码


import cn.hutool.core.lang.Console;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
import com.formdev.flatlaf.FlatLightLaf;
import com.mynote.core.ui.ColorBuilder;
import com.mynote.core.util.FrameUtil;
import com.mynote.example.demo.AbstractDefaultPanel;
import lombok.Getter;
import lombok.Setter;
import net.miginfocom.swing.MigLayout;import javax.swing.*;
import java.awt.*;/*** @description: Graphics测试* @author: jee*/
public class GraphicsTest extends AbstractDefaultPanel {@Overrideprotected void init() {}@Overrideprotected void render() {view.setLayout(new MigLayout("wrap 1"));JTabbedPane layouts = new JTabbedPane(JTabbedPane.LEFT);layouts.addTab("直线", new GraphicsLine());layouts.addTab("折线", new GraphicsPolyline());layouts.addTab("矩形", new GraphicsRect());layouts.addTab("圆形", new GraphicsCircle());layouts.addTab("多边形", new GraphicsCustom());layouts.setSelectedIndex(layouts.getTabCount() - 1);view.add(layouts, "w 800,center");super.add(view, "w 100%,h 100%");}@Overrideprotected void bindEvents() {}/*** 标题panel*/private class DocPanel extends JPanel {public DocPanel(String title) {super();this.setBorder(BorderFactory.createTitledBorder(title));}}/*** 创建随机一组点*/private int[] createRandomPoints(int start, int repeat, int offset, boolean isNegative) {int index = 0;int[] randomOffsets = {-2, -1, 1, 2};int randomOffset = 1;int[] points = new int[repeat];while (index < repeat) {if (isNegative) {randomOffset = randomOffsets[RandomUtil.randomInt(randomOffsets.length)];} else {randomOffset += 1;}points[index] = start + offset * randomOffset;index++;}return points;}/*** 线*/private class GraphicsLine extends JPanel {public GraphicsLine() {super.setLayout(new MigLayout("wrap 1"));super.add(createLine("直线", 50, 50, 200, 50), "w 100%,h 120");super.add(createLine("斜线1", 50, 100, 100, 50), "w 100%,h 120");super.add(createLine("斜线2", 50, 50, 100, 100), "w 100%,h 120");}private DocPanel createLine(String title, int x1, int y1, int x2, int y2) {return new DocPanel(title) {@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawLine(x1, y1, x2, y2);g2.dispose();}};}}/*** 折线*/private class GraphicsPolyline extends JPanel {public GraphicsPolyline() {super.setLayout(new MigLayout("wrap 1"));createPolyline("折线1", 10);createPolyline("折线2", 30);}public void createPolyline(String title, int count) {int[] xPoints = createRandomPoints(50, count, 20, false);int[] yPoints = createRandomPoints(50, count, 10, true);super.add(createPolyline(title, xPoints, yPoints, count), "w 100%,h 200");}private DocPanel createPolyline(String title, int[] xPoints, int[] yPoints, int nPoints) {return new DocPanel(title) {@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawPolyline(xPoints, yPoints, nPoints);g2.dispose();}};}}/*** 矩形*/private class GraphicsRect extends JPanel {public GraphicsRect() {super.setLayout(new MigLayout("wrap 1"));super.add(createRect("空心矩形", 50, 50, 200, 50, false), "w 100%,h 120");super.add(createRect("填充矩形", 50, 50, 200, 50, true), "w 100%,h 120");super.add(createRoundRect("圆角矩形", 50, 50, 200, 50, 10), "w 100%,h 120");}private DocPanel createRect(String title, int x, int y, int width, int height, boolean isFill) {return new DocPanel(title) {@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawRect(x, y, width, height);if (isFill) {g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.fillRect(x, y, width, height);}g2.dispose();}};}private DocPanel createRoundRect(String title, int x, int y, int width, int height, int r) {return new DocPanel(title) {@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawRoundRect(x, y, width, height, r, r);// g2.fillRoundRect 填充颜色g2.dispose();}};}}/*** 圆形*/private class GraphicsCircle extends JPanel {public GraphicsCircle() {super.setLayout(new MigLayout("wrap 1"));super.add(createCircle("空心圆形", 50, 50, 100, false), "w 100%,h 200");super.add(createCircle("实心圆形", 50, 50, 100, true), "w 100%,h 200");super.add(createOval("椭圆", 50, 50, 100, 50, false), "w 100%,h 200");}private DocPanel createCircle(String title, int x, int y, int r, boolean isFill) {return createOval(title, x, y, r, r, isFill);}private DocPanel createOval(String title, int x, int y, int width, int height, boolean isFill) {return new DocPanel(title) {@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawOval(x, y, width, height);if (isFill) {g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.fillOval(x, y, width, height);}g2.dispose();}};}}@Setter@Getterprivate class GraPoint {int x;int y;public GraPoint(int x, int y) {this.x = x;this.y = y;}}/*** 自定义*/private class GraphicsCustom extends JPanel {public GraphicsCustom() {super.setLayout(new MigLayout("wrap 2"));super.add(createSimpleTriangle(), "w 50%,h 150");super.add(createQuadrilateral("平行四边形", false), "w 50%,h 150");super.add(createQuadrilateral("直角梯形", true), "w 50%,h 150");int[] xPoints = {25, 50, 100, 125, 100, 50, 25};int[] yPoints = {75, 50, 50, 75, 100, 100, 75};super.add(createPolygon("六边形", xPoints, yPoints, xPoints.length), "w 50%,h 150");super.add(createSector("70°扇形", 50, 30, 100), "w 50%,h 150");super.add(createSector("120°扇形", 60, 30, 150), "w 50%,h 150");}private DocPanel createSimpleTriangle() {GraPoint p1 = new GraPoint(50, 50);GraPoint p2 = new GraPoint(200, 50);GraPoint p3 = new GraPoint(150, 100);return createPolygon("三角形", p1, p2, p3, p1);}private DocPanel createQuadrilateral(String title, boolean isTrapezoidal) {int x = 50;int y = 50;int l = 100;int nx = 40;int ny = 100;GraPoint p1 = new GraPoint(x, y);GraPoint p2 = new GraPoint(nx, ny);GraPoint p3 = new GraPoint(nx + l, ny);GraPoint p4 = new GraPoint(x + l, y);if (isTrapezoidal) {p4 = new GraPoint(nx + l, y);}return createPolygon(title, p1, p2, p3, p4, p1);}private DocPanel createParallelogram() {int x = 50;int y = 50;int l = 100;int nx = 40;int ny = 100;GraPoint p1 = new GraPoint(x, y);GraPoint p2 = new GraPoint(nx, ny);GraPoint p3 = new GraPoint(nx + l, ny);GraPoint p4 = new GraPoint(x + l, y);return createPolygon("平行四边形", p1, p2, p3, p4, p1);}private DocPanel createPolygon(String title, GraPoint... points) {int n = points.length;int[] xPoints = new int[n];int[] yPoints = new int[n];for (GraPoint p : points) {n--;xPoints[n] = p.getX();yPoints[n] = p.getY();}return createPolygon(title, xPoints, yPoints, points.length);}/*** 多边形** @return*/private DocPanel createPolygon(String title, int[] xPoints, int[] yPoints, int nPoints) {return new DocPanel(title) {@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawPolygon(xPoints, yPoints, nPoints);g2.dispose();}};}/*** 扇形** @return*/private DocPanel createSector(String title, int r, int startAngle, int endAngle) {return new DocPanel(title) {@Overridepublic void paint(Graphics g) {super.paint(g);Graphics2D g2 = (Graphics2D) g;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 原点int startX = 50;int startY = 50;// 弧度int arcAngle = endAngle - startAngle;// 中心点int centerX = startX + r;int centerY = startY + r;g2.setColor(Color.RED);// 标注起始点g2.drawLine(startX - 1, startY - 1, startX + 1, startY + 1);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawArc(startX, startY, r * 2, r * 2, startAngle, arcAngle);// ps: 逆时针画的// 计算扇形弧线起点int x2 = centerX + NumberUtil.parseInt(Math.ceil(r * Math.cos(Math.toRadians(startAngle))) + "");int y2 = centerY - NumberUtil.parseInt(Math.ceil(r * Math.sin(Math.toRadians(startAngle))) + "");// 计算扇形弧线终点int x1 = centerX - NumberUtil.parseInt(Math.ceil(r * Math.cos(Math.toRadians(180 - endAngle))) + "");int y1 = centerY - NumberUtil.parseInt(Math.ceil(r * Math.sin(Math.toRadians(180 - endAngle))) + "");Console.log("start x,y:{},{} === end x,y:{},{}", x1, y1, x2, y2);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawLine(x1, y1, centerX, centerY);g2.setColor(ColorBuilder.BG_BLANK_COLOR1);g2.drawLine(centerX, centerY, x2, y2);g2.dispose();}};}}public static void main(String[] args) {FlatLightLaf.install();FrameUtil.launchTest(new GraphicsTest());}}

swing-基础Graphics画布相关推荐

  1. c#创建画布_C#GDI+编程基础(一:Graphics画布类)

    GDI+存在的意义:将变成与具体硬件实现细节分开. GDI+步骤:获取画布,绘制图像.处理图像 命名空间: using System.Drawing;//提供对GDI+基本图形功能的访问 using ...

  2. Android游戏开发基础part2--Canvas画布

    游戏开发基础part2--Canvas画布 又过了一周才继续做总结,四级结束了,应该可以多点时间学习游戏编程了. Canvas画布类是一个在游戏当中担当非常重要的角色,它可以绘制出不同的图形和图片,可 ...

  3. java窗体jmeun刷新,java – JME 3 Swing,多幅画布

    我正在玩JME3,目前面临以下问题: 当LWJGL画布包含在多个应用程序选项卡中时,它们都不会或仅运行一次. 这是一个例子: SwingCanvas.java: package jme3test.he ...

  4. 关于Java.Swing中Graphics 的应用(简单的一篇就够)

    Graphics中可画的图形 graphics中可以画出的简单图形以及相关函数 图形 调用的函数 说明 划线 drawLine(int x1,int y1,int x2,int y2)         ...

  5. 图形学基础概念(画布/位图/像素等)

    这里写目录标题 1 介绍 2 基本概念 3 基础demo框架搭建 3.1 win32窗口原理 3.2 搭建demo框架 4 点/直线/雪花效果 1 介绍 看过那些书,走过那些路,依然过不好这一生:用过 ...

  6. Swing基础知识(更新中)

    Swing是什么 做桌面应用程序的界面,GUI. 组件和容器:容器是特殊的组件. 布局管理器: 一般放中间容器,用来控制容器中组件的排列方式. 常见: ① FlowLayout 流布局(默认布局) 左 ...

  7. WPF 3D基础学习 - 画布、相机、Model3D(1)

    如果绘制3D立方体,需绘制6个面:下面代码绘制一个面:来逐步理解此代码: <Pagexmlns="http://schemas.microsoft.com/winfx/2006/xam ...

  8. java画笔覆盖在界面_Java学习笔记:swing画笔工具Graphics,刷新页面,键盘事件,随机数等【诗书画唱】...

    Graphics:画笔工具 setColor:设置画笔颜色 DrawRect:空心矩形 fillRect:实心矩形 DrawOavl:空心圆 fillOavl:实心圆 DrawLine:画线(注意) ...

  9. Java Swing基础使用教程

    Java Swing是Java语言中的一个GUI工具包,它提供了一系列的组件和容器,可以用于创建各种桌面应用程序.本教程将介绍Java Swing的基本概念.组件和容器,以及如何使用它们来创建一个简单 ...

  10. 利用Java Swing 实现游戏开发

    Swing初体验 对于想学习Swing编程的朋友,我们特地为大家准备了一些小窍门.首先,下载并阅读代码是极有必要的.由于这是一篇关于Swing的教程,所以,我们只是尽可能讲解一些与Swing有关的内容 ...

最新文章

  1. 神经网络模拟逻辑推理-演绎推理
  2. lamp介绍,wordpress,phpmyadmin,discuzz安装
  3. md5-linux_shell
  4. mysql 导出函数_mysql导出存储过程或函数
  5. RHCS套件实现高可用负载均衡集群(三)——共享存储
  6. Linux下常用的压缩与解压命令
  7. 使用DBUnit框架数据库插入特殊字符失败的查错经历
  8. python字符串逆序输出代码_一行代码实现字符串逆序输出
  9. java log 断点_项目中常见的log日志调用
  10. 编辑神器Vi介绍及常用命令
  11. 华为云网络测量如何“悬丝诊脉”
  12. cocos2d-x3.6 连连看随机地图实现
  13. 文本属性之文本颜色(CSS、HTML)
  14. 如何在Mac上轻松使用SVN
  15. chm打开秒退_【CHM+】CHM+下载_CHM+教程 _正版CHM+下载 -爱应用
  16. 51精密线路板年终活动,爆款降临
  17. brew对redis的使用
  18. MACOS 苹果系统 微信多开
  19. proto3字段值为空时被忽略问题
  20. 20135304刘世鹏——信息安全系统设计基础第一周学习总结

热门文章

  1. 腾讯帝国的2018年,本命年过得不是很顺利
  2. 黑客是如何入侵网站?为什么企业网站需要渗透测试?
  3. Google SketchUp SDK
  4. 取向性完全不同 骐达英朗底盘对比解析
  5. html中的图片路径ie8,IE8下文件上传时获取文件的真实路径
  6. 深入理解 http 反向代理(nginx)
  7. 使用java压缩文件成zip——三种方式压缩文件速度对比
  8. P3554 LUK-Triumphal arch 解题报告
  9. android 入侵检测系统,基于行为模式的Android平台入侵检测系统的设计与实现
  10. 五层木桶理论/五层木桶理论