swing-基础Graphics画布
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画布相关推荐
- c#创建画布_C#GDI+编程基础(一:Graphics画布类)
GDI+存在的意义:将变成与具体硬件实现细节分开. GDI+步骤:获取画布,绘制图像.处理图像 命名空间: using System.Drawing;//提供对GDI+基本图形功能的访问 using ...
- Android游戏开发基础part2--Canvas画布
游戏开发基础part2--Canvas画布 又过了一周才继续做总结,四级结束了,应该可以多点时间学习游戏编程了. Canvas画布类是一个在游戏当中担当非常重要的角色,它可以绘制出不同的图形和图片,可 ...
- java窗体jmeun刷新,java – JME 3 Swing,多幅画布
我正在玩JME3,目前面临以下问题: 当LWJGL画布包含在多个应用程序选项卡中时,它们都不会或仅运行一次. 这是一个例子: SwingCanvas.java: package jme3test.he ...
- 关于Java.Swing中Graphics 的应用(简单的一篇就够)
Graphics中可画的图形 graphics中可以画出的简单图形以及相关函数 图形 调用的函数 说明 划线 drawLine(int x1,int y1,int x2,int y2) ...
- 图形学基础概念(画布/位图/像素等)
这里写目录标题 1 介绍 2 基本概念 3 基础demo框架搭建 3.1 win32窗口原理 3.2 搭建demo框架 4 点/直线/雪花效果 1 介绍 看过那些书,走过那些路,依然过不好这一生:用过 ...
- Swing基础知识(更新中)
Swing是什么 做桌面应用程序的界面,GUI. 组件和容器:容器是特殊的组件. 布局管理器: 一般放中间容器,用来控制容器中组件的排列方式. 常见: ① FlowLayout 流布局(默认布局) 左 ...
- WPF 3D基础学习 - 画布、相机、Model3D(1)
如果绘制3D立方体,需绘制6个面:下面代码绘制一个面:来逐步理解此代码: <Pagexmlns="http://schemas.microsoft.com/winfx/2006/xam ...
- java画笔覆盖在界面_Java学习笔记:swing画笔工具Graphics,刷新页面,键盘事件,随机数等【诗书画唱】...
Graphics:画笔工具 setColor:设置画笔颜色 DrawRect:空心矩形 fillRect:实心矩形 DrawOavl:空心圆 fillOavl:实心圆 DrawLine:画线(注意) ...
- Java Swing基础使用教程
Java Swing是Java语言中的一个GUI工具包,它提供了一系列的组件和容器,可以用于创建各种桌面应用程序.本教程将介绍Java Swing的基本概念.组件和容器,以及如何使用它们来创建一个简单 ...
- 利用Java Swing 实现游戏开发
Swing初体验 对于想学习Swing编程的朋友,我们特地为大家准备了一些小窍门.首先,下载并阅读代码是极有必要的.由于这是一篇关于Swing的教程,所以,我们只是尽可能讲解一些与Swing有关的内容 ...
最新文章
- 神经网络模拟逻辑推理-演绎推理
- lamp介绍,wordpress,phpmyadmin,discuzz安装
- md5-linux_shell
- mysql 导出函数_mysql导出存储过程或函数
- RHCS套件实现高可用负载均衡集群(三)——共享存储
- Linux下常用的压缩与解压命令
- 使用DBUnit框架数据库插入特殊字符失败的查错经历
- python字符串逆序输出代码_一行代码实现字符串逆序输出
- java log 断点_项目中常见的log日志调用
- 编辑神器Vi介绍及常用命令
- 华为云网络测量如何“悬丝诊脉”
- cocos2d-x3.6 连连看随机地图实现
- 文本属性之文本颜色(CSS、HTML)
- 如何在Mac上轻松使用SVN
- chm打开秒退_【CHM+】CHM+下载_CHM+教程 _正版CHM+下载 -爱应用
- 51精密线路板年终活动,爆款降临
- brew对redis的使用
- MACOS 苹果系统 微信多开
- proto3字段值为空时被忽略问题
- 20135304刘世鹏——信息安全系统设计基础第一周学习总结