Java-GUI編程之繪圖

来源:https://www.cnblogs.com/kohler21/archive/2022/04/08/16115647.html
-Advertisement-
Play Games

繪圖 很多程式如各種小游戲都需要在視窗中繪製各種圖形,除此之外,即使在開發JavaEE項目時,有時候也必須"動態"地向客戶 端生成各種圖形、圖表,比如 圖形驗證碼、統計圖等,這都需要利用AWT的繪圖功能。 組件繪圖原理 之前我們已經學習過很多組件,例如Button、Frame、Checkbox等等, ...


繪圖

很多程式如各種小游戲都需要在視窗中繪製各種圖形,除此之外,即使在開發JavaEE項目時,有時候也必須"動態"地向客戶 端生成各種圖形、圖表,比如 圖形驗證碼、統計圖等,這都需要利用AWT的繪圖功能。

組件繪圖原理

之前我們已經學習過很多組件,例如Button、Frame、Checkbox等等,不同的組件,展示出來的圖形都不一樣,其實這些組件展示出來的圖形,其本質就是用AWT的繪圖來完成的。

​ 在AWT中,真正提供繪圖功能的是Graphics對象,那麼Component組件和Graphics對象存在什麼關係,才能讓Component繪製自身圖形呢?在Component類中,提供了下列三個方法來完成組件圖形的繪製與刷新:

​ paint(Graphics g):繪製組件的外觀;

​ update(Graphics g):內部調用paint方法,刷新組件外觀;

​ repaint():調用update方法,刷新組件外觀;

一般情況下,update和paint方法是由AWT系統負責調用,如果程式要希望系統重新繪製組件,可以調用repaint方法完成。

Graphics類的使用

實際生活中如果需要畫圖,首先我們得準備一張紙,然後在拿一支畫筆,配和一些顏色,就可以在紙上畫出來各種各樣的圖形,例如圓圈、矩形等等。

程式中繪圖也一樣,也需要畫布,畫筆,顏料等等。AWT中提供了Canvas類充當畫布,提供了Graphics類來充當畫筆,通過調用Graphics對象的setColor()方法可以給畫筆設置顏色。

畫圖的步驟:

1.自定義類,繼承Canvas類,重寫paint(Graphics g)方法完成畫圖;

2.在paint方法內部,真正開始畫圖之前調用Graphics對象的setColor()、setFont()等方法設置畫筆的顏色、字體等屬性;

3.調用Graphics畫筆的drawXxx()方法開始畫圖。

其實畫圖的核心就在於使用Graphics畫筆在Canvas畫布上畫出什麼顏色、什麼樣式的圖形,所以核心在畫筆上,下表中列出了Graphics類中常用的一些方法:

方法名稱 方法功能
setColor(Color c) 設置顏色
setFont(Font font) 設置字體
drawLine() 繪製直線
drawRect() 繪製矩形
drawRoundRect() 繪製圓角矩形
drawOval() 繪製橢圓形
drawPolygon() 繪製多邊形
drawArc() 繪製圓弧
drawPolyline() 繪製折線
fillRect() 填充矩形區域
fillRoundRect() 填充圓角矩形區域
fillOval() 填充橢圓區域
fillPolygon() 填充多邊形區域
fillArc() 填充圓弧對應的扇形區域
drawImage() 繪製點陣圖

案例:

​ 使用AWT繪圖API,完成下圖效果

演示代碼:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class SimpleDraw {

    private final String RECT_SHAPE="rect";
    private final String OVAL_SHAPE="oval";
    private Frame frame = new Frame("這裡測試繪圖");
    private Button drawRectBtn = new Button("繪製矩形");
    private Button drawOvalBtn = new Button("繪製橢圓");

    //用來保存當前用戶需要繪製什麼樣的圖形
    private String shape="";
    private MyCanvas drawArea = new MyCanvas();
    public void init(){

        //為按鈕添加點擊事件
        drawRectBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                shape = RECT_SHAPE;
                drawArea.repaint();
            }
        });

        drawOvalBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                shape = OVAL_SHAPE;
                drawArea.repaint();
            }
        });

        //定義一個Panel,裝載兩個按鈕
        Panel p = new Panel();
        p.add(drawRectBtn);
        p.add(drawOvalBtn);

        //把panel添加到frame底部
        frame.add(p,BorderLayout.SOUTH);
        
        //設置畫布的大小
        drawArea.setPreferredSize(new Dimension(300,200));
        //把畫布添加到frame中

        frame.add(drawArea);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new SimpleDraw().init();
    }
    //1.自定義類,繼承Canvas類,重寫paint方法

    private class MyCanvas extends Canvas{
        @Override
        public void paint(Graphics g) {
            Random r = new Random();

            if (shape.equals(RECT_SHAPE)){
                //繪製矩形
                g.setColor(Color.BLACK);
                g.drawRect(r.nextInt(200),r.nextInt(100),40,60);
            }
            if(shape.equals(OVAL_SHAPE)){
                //繪製橢圓
                g.setColor(Color.RED);
                g.drawOval(r.nextInt(200),r.nextInt(100),60,40);
            }

        }
    }
}

公眾號文章地址:https://mp.weixin.qq.com/s/SM5phr1qV4LLULNrdXiqcA

個人博客:https://kohler19.gitee.io/
公眾號:愚生淺末

歡迎關註我的公眾號,共同學習


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近《孤勇者》這首歌特別火,我也覺得很好聽,不得不給陳奕迅點一個大大的贊。今天想用Python來做一個《孤勇者》的畫圖以及音樂可視化。 python里有個叫做 turtle 的庫,用它提供的方法可以很簡單的畫線和塗色: Python學習交流Q群:906715085#### import turtle ...
  • 作者:xbhog 鏈接:www.cnblogs.com/xbhog/p/15207278.html 異常處理: 背景: 最近在搭建屬於自己的個人博客(碼農小白的執念),自己搭建後端的時候首先考慮的是異常處理。個人也是一邊學習一邊做,難免有疏漏的地方,希望朋友們在不對的地方提醒下。 技術棧: spri ...
  • 最近這段時間,一些互聯網大廠把裁員稱為“畢業”的話題被熱議了很久。 上午,DD在網上瞎逛看到了一篇文章,似乎找了這一做法的祖先。原來這麼有“創意”的操作,很好多年前的漂亮過就已經有了,所以其實這也是個舶來品? 在這篇發表於2016年4月的文章中,據作者稱:他在軟體公司HubSpot工作了近兩年,當有 ...
  • 前言 在github中經常可以看到下麵的日曆圖,可以用來表示每一天在github上的活躍程度。 類似的方法也可以用到空氣質量的可視化方式中來,只要有每天的空氣質量指數就可以。 數據 我這裡使用的是2020年北京市各個監測站點的空氣質量觀測數據,原始數據包含PM2.5,PM10,AQI指數,這裡選擇A ...
  • 前排提醒: 由於 Microsoft Docs 全是機翻。所以本文表格是我人腦補翻+審校。 如果有紕漏、模糊及時評論反饋。 序列式容器 序列容器是指在邏輯上以線性排列方式存儲給定類型元素的容器。 這些容器和數組非常類似,都是在邏輯上連續的(但記憶體不一定是連續的),與數組不同的是,容器可以非常方便的動 ...
  • 前言 今天玩啥?10行代碼夠玩嗎? Python憑藉其簡潔的代碼,贏得了許多開發者的喜愛。因此也就促使了更多開發者用Python開發新的模塊,從而形成良性迴圈, Python可以憑藉更加簡短的代碼實現許多有趣的操作。下麵我們來看看,我們用不超過10行代碼能實現些什麼有趣的功能。 一、生成二維碼 二維 ...
  • 高併發、多線程一直是Java編程中的難點,也是面試題中的要點。Java開發者也一直在嘗試使用多線程來解決應用伺服器的併發問題。但是多線程並不容易,為此一個新的技術出現了,這就是虛擬線程。 傳統多線程的痛點 但是編寫多線程代碼是非常不容易的,難以控制的執行順序,共用變數的線程安全性,異常的可觀察性等等 ...
  • 定時執行任務-springboot 先看兩個介面 這兩個介面springboot已經幫我們封裝好了,我們不需要去手動使用 TaskScheduler //任務調度者 TaskExecutor //任務執行者 具體步驟: 在啟動類上添加這個註解: @EnableScheduling//開啟定時功能的註 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...