Java | 绘图:Graphics2D
生活随笔
收集整理的這篇文章主要介紹了
Java | 绘图:Graphics2D
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在 Swing 組件的實際繪制中通常使用的是 Graphics 的一個子類 Graphics2D, 該類中提供了更為豐富的接口來繪制更為復雜的需求。
Graphics2D類中的部分方法:
1、參數 / 設置
// 設置背景(擦除后顯示該背景)
void setBackground(Color color)
// 設置筆畫的輪廓特性(如畫筆寬度、實線、虛線等)
void setStroke(Stroke s)
2、繪制結果的變換
// 平移
void translate(int x, int y)
// 旋轉
void rotate(double theta, double originX, double originY)
// 縮放
void scale(double sx, double sy)
// 將圖片經過指定變換后繪制顯示
boolean drawImage(Image image, AffineTransform xform, ImageObserver obs)
3. 自定義組件, 繪圖演示(直線曲線、矩形、橢圓等等)
import javax.swing.*; import java.awt.*;public class Main {public static void main(String[] args) {/** 在 AWT 的事件隊列線程中創建窗口和組件, 確保線程安全,* 即 組件創建、繪制、事件響應 需要處于同一線程。*/EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {// 創建窗口對象MyFrame frame = new MyFrame();// 顯示窗口frame.setVisible(true);}});}/*** 窗口*/public static class MyFrame extends JFrame {public static final String TITLE = "Java圖形繪制";public static final int WIDTH = 250;public static final int HEIGHT = 300;public MyFrame() {super();initFrame();}private void initFrame() {// 設置 窗口標題 和 窗口大小setTitle(TITLE);setSize(WIDTH, HEIGHT);// 設置窗口關閉按鈕的默認操作(點擊關閉時退出進程)setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// 把窗口位置設置到屏幕的中心setLocationRelativeTo(null);// 設置窗口的內容面板MyPanel panel = new MyPanel(this);setContentPane(panel);}}/*** 內容面板*/public static class MyPanel extends JPanel {private MyFrame frame;public MyPanel(MyFrame frame) {super();this.frame = frame;}/*** 繪制面板的內容: 創建 JPanel 后會調用一次該方法繪制內容,* 之后如果數據改變需要重新繪制, 可調用 updateUI() 方法觸發* 系統再次調用該方法繪制更新 JPanel 的內容。*/@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 重新調用 Graphics 的繪制方法繪制時將自動擦除舊的內容/* 自行打開下面注釋查看各繪制效果 */// 1. 線段 / 折線drawLine(g);// 2. 矩形 / 多邊形// drawRect(g);// 3. 圓弧 / 扇形// drawArc(g);// 4. 橢圓// drawOval(g);// 5. 圖片// drawImage(g);// 6. 文本// drawString(g);}/*** 1. 線段 / 折線*/private void drawLine(Graphics g) {frame.setTitle("1. 線段 / 折線");// 創建 Graphics 的副本, 需要改變 Graphics 的參數,// 這里必須使用副本, 避免影響到 Graphics 原有的設置Graphics2D g2d = (Graphics2D) g.create();// 抗鋸齒g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 設置畫筆顏色g2d.setColor(Color.RED);// 1. 兩點繪制線段: 點(20, 50), 點(200, 50)g2d.drawLine(50, 50, 200, 50);// 2. 多點繪制折線: 點(50, 100), 點(100, 130), 點(150, 70), 點(200, 100)int[] xPoints = new int[] { 50, 100, 150, 200 };int[] yPoints = new int[] { 100, 120, 80, 100 };int nPoints = 4;g2d.drawPolyline(xPoints, yPoints, nPoints);// 3. 兩點繪制線段(設置線寬為5px): 點(50, 150), 點(200, 150)BasicStroke bs1 = new BasicStroke(5); ? ? ? // 筆畫的輪廓(畫筆寬度/線寬為5px)g2d.setStroke(bs1);g2d.drawLine(50, 150, 200, 150);// 4. 繪制虛線: 將虛線分為若干段( 實線段 和 空白段 都認為是一段), 實線段 和 空白段 交替繪制,// ? ? ? ? ? ? 繪制的每一段(包括 實線段 和 空白段)的 長度 從 dash 虛線模式數組中取值(從首// ? ? ? ? ? ? 元素開始循環取值), 下面數組即表示每段長度分別為: 5px, 10px, 5px, 10px, ...float[] dash = new float[] { 5, 10 };BasicStroke bs2 = new BasicStroke(1, ? ? ? ? ? ? ? ? ? ? ?// 畫筆寬度/線寬BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER,10.0f,dash, ? ? ? ? ? ? ? ? ? // 虛線模式數組0.0f);g2d.setStroke(bs2);g2d.drawLine(50, 200, 200, 200);// 自己創建的副本用完要銷毀掉g2d.dispose();}/*** 2. 矩形 / 多邊形*/private void drawRect(Graphics g) {frame.setTitle("2. 矩形 / 多邊形");Graphics2D g2d = (Graphics2D) g.create();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.setColor(Color.GRAY);// 1. 繪制一個矩形: 起點(30, 20), 寬80, 高100g2d.drawRect(30, 20, 80, 100);// 2. 填充一個矩形g2d.fillRect(140, 20, 80, 100);// 3. 繪制一個圓角矩形: 起點(30, 150), 寬80, 高100, 圓角寬30, 圓角高30g2d.drawRoundRect(30, 150, 80, 100, 30, 30);// 4. 繪制一個多邊形(收尾相連): 點(140, 150), 點(180, 250), 點(220, 200)int[] xPoints = new int[] { 140, 180, 220};int[] yPoints = new int[] { 150, ?250, 200};int nPoints = 3;g2d.drawPolygon(xPoints, yPoints, nPoints);g2d.dispose();}/*** 3. 圓弧 / 扇形*/private void drawArc(Graphics g) {frame.setTitle("3. 圓弧 / 扇形");Graphics2D g2d = (Graphics2D) g.create();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.setColor(Color.RED);// 1. 繪制一條圓弧: 橢圓的外切矩形 左上角坐標為(0, 0), 寬100, 高100,// ? ? ? ? ? ? ? ?弧的開始角度為0度, 需要繪制的角度數為-90度,// ? ? ? ? ? ? ? ?橢圓右邊水平線為0度, 逆時針為正角度, 順時針為負角度g2d.drawArc(0, 0, 100, 100, 0, -90);// 2. 繪制一個圓: 圓的外切矩形 左上角坐標為(120, 20), 寬高為100g2d.drawArc(120, 20, 100, 100, 0, 360);g2d.setColor(Color.GRAY);// 3. 填充一個扇形g2d.fillArc(80, 150, 100, 100, 90, 270);g2d.dispose();}/*** 4. 橢圓 (實際上通過繪制360度的圓弧/扇形也能達到繪制圓/橢圓的效果)*/private void drawOval(Graphics g) {frame.setTitle("4. 橢圓");Graphics2D g2d = (Graphics2D) g.create();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.setColor(Color.RED);// 1. 繪制一個圓: 圓的外切矩形 左上角坐標為(0, 0), 寬高為100g2d.drawOval(0, 0, 100, 100);g2d.setColor(Color.GRAY);// 2. 填充一個橢圓g2d.fillOval(120, 100, 100, 150);g2d.dispose();}/*** 5. 圖片*/private void drawImage(Graphics g) {frame.setTitle("5. 圖片");Graphics2D g2d = (Graphics2D) g.create();// 從本地讀取一張圖片String filepath = "demo.jpg";Image image = Toolkit.getDefaultToolkit().getImage(filepath);// 繪制圖片(如果寬高傳的不是圖片原本的寬高, 則圖片將會適當縮放繪制)g2d.drawImage(image, 50, 50, image.getWidth(this), image.getHeight(this), this);g2d.dispose();}/*** 6. 文本*/private void drawString(Graphics g) {frame.setTitle("6. 文本");Graphics2D g2d = (Graphics2D) g.create();g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 設置字體樣式, null 表示使用默認字體, Font.PLAIN 為普通樣式, 大小為 25pxg2d.setFont(new Font(null, Font.PLAIN, 25));// 繪制文本, 其中坐標參數指的是文本繪制后的 左下角 的位置// 首次繪制需要初始化字體, 可能需要較耗時g2d.drawString("Hello World!", 20, 60);g2d.drawString("你好, 世界!", 20, 120);g2d.dispose();}}}總結
以上是生活随笔為你收集整理的Java | 绘图:Graphics2D的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java monitor
- 下一篇: Java2实用教程第五版+第七章习题答案