日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

swing-基础Graphics画布

發布時間:2023/12/18 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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画布的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品无人区 | 奇米91| a级片在线视频 | 96免费视频| 国产成人啪精品午夜在线观看 | 91精品国产闺蜜国产在线闺蜜 | 国产不卡二区 | 亚洲第一页在线 | 九九热在线免费视频 | 欧美在线看 | 视频在线观看你懂的 | 91视频综合网 | 久久99免费 | 日韩一区二区影视 | 国产又黄又粗又猛又爽的视频 | 密臀av| 粗大的内捧猛烈进出 | 色无极影院亚洲 | 欧美日韩不卡在线 | 欧美久久综合网 | 毛片亚洲av无码精品国产午夜 | 日日网站 | 日本国产一区二区 | 深夜老司机福利 | 女同动漫免费观看高清完整版在线观看 | 日本大尺度激情做爰hd | 欧美黄色录像片 | 九九黄色片 | 正在播放超嫩在线播放 | 日韩一区二区免费播放 | 亚洲视频一区在线观看 | 成人另类小说 | 国精产品一品二品国精品69xx | 麻豆精品久久久 | 久久婷五月 | 亚洲色图13p| 亚日韩一区 | 中文字幕在线观看视频网站 | 久久久久国产精品午夜一区 | 国产资源av | 快色视频在线观看 | 国产成人黄色 | 69堂在线观看 | 久热精品视频在线观看 | 免费爱爱视频网站 | 波多野结衣大片 | 69精品一区二区三区 | av资源在线播放 | 牲欲强的熟妇农村老妇女视频 | 日韩午夜片 | 欧美性久久 | 欧美jizzhd精品欧美18 | 欧美人与禽zozzo禽性配 | 911看片| 999国产精品视频免费 | 自拍偷拍p | 青青草国产一区二区三区 | 日韩综合一区二区三区 | 成人性生交大片免费 | 小泽玛利亚一区二区三区视频 | sm国产在线调教视频 | 色婷婷狠狠爱 | 亚洲天堂五码 | 操人视频免费 | 激情宗合网 | 久久久成人免费视频 | 国产黄色91 | 久久综合干 | 日韩理论在线 | 白白色在线观看 | 亚洲毛片在线观看 | 国产精品不卡 | 久久精品国内 | 大尺度做爰呻吟舌吻网站 | 老司机福利av | 一区二区日韩av | 成人看片网站 | 日本69式三人交 | 福利视频一区二区 | 黄av在线播放 | 午夜小电影 | 人妻激情偷乱视频一区二区三区 | 天堂va蜜桃一区二区三区 | 日韩影院一区 | 桃色视频在线 | 午夜家庭影院 | 亚洲大片| 中文字幕乱码一区二区三区 | 日本少妇xxxx软件 | 图书馆的女友在线观看 | 中文字幕无人区二 | 99成人| 国产精品久久久久影院色老大 | 国产精品毛片久久久久久久av | 日韩色一区 | 欧美射射射 | 在线观看成人黄色 | 九月婷婷丁香 | 免费黄av |