繪圖 很多程式如各種小游戲都需要在視窗中繪製各種圖形,除此之外,即使在開發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/
公眾號:愚生淺末