Java學習記錄 AWT繪圖篇
繪製圖形
Canvas畫布類
Class Canvas
java.lang.Object
java.awt.Component
java.awt.Canvas
用來 繪製圖形 或 捕獲使用者輸入的事件。繪製圖形需要繪圖方法實現繪製圖形
方法 | 說明 |
---|---|
paint(Graphics g) | 繪圖 |
repaint(Graphics g) | 重新繪圖 |
Graphics繪圖類
Class Graphics
java.lang.Object
java.awt.Graphics
Graphics繪圖類 是所有圖形的抽象基類,它提供了繪圖常用的方法
圖形 | 方法 |
---|---|
弧形 | drawArc(int x , int y , int width , int height , int startAngle , int arcAngle) |
直線 | drawLine(int x1 , int y1 , int x2 , int y2) |
橢圓 | drawOval(int x , int y , int width , int height) |
多邊形 | drawPolygon(int[] xPoints , int[] yPoints , int nPoints) |
多邊線 | drawPolyline(int[] xPoints , int[] yPoints , int nPoints) |
矩形 | drawRect(int x , int y , int width , int height) |
圓角矩形 | drawRoundRect(int x , int y , int width , int height , int arcWidth, int arcHeight) |
實心弧形 | fillArc(int x , int y , int width , int height , int height , int startAngle , int arcAngle) |
實心橢圓 | fillOval(int x , int y , int width , int height) |
實心多邊形 | fillPolygon(int[] xPoints , int[] yPoints , int nPoints) |
實心矩形 | fillRect(int x , int y , int width , int height) |
實心圓角矩形 | fillRoundRect(int x , int y , int width , int height , int arcWidth, int arcHeight) |
引數 | 說明 |
---|---|
x | 座標X |
y | 座標Y |
width | 寬度 |
height | 高度 |
startAngle | 起始角度 |
arcAngle | 相對起始角度的弧的角度範圍 |
xPoints | X座標的陣列 |
yPoints | Y座標的陣列 |
nPoints | 總數 |
arcWidth | 四角圓弧的水平直徑 |
arcHeight | 四角圓弧的垂直直徑 |
Graphics2D新繪圖類
Class Graphics2D
java.lang.Object
java.awt.Graphics
java.awt.Graphics2D
Graphics類的擴充套件 Graphics2D新繪圖類,它必須要 draw()和fill() 方法 繪圖
方法的引數需要Shape圖形介面實現繪圖(介面在 java.awt.geom 包下
抽象方法 | 說明 |
---|---|
draw(Shape form) | 繪製圖形 |
fill(Shape form) | 填充圖形 |
form:Shape圖形介面的物件
程式碼繪製流程
- 建立窗體物件
- 建立 Canvas畫布類 並新增入窗體容器裡
- 呼叫 Canvas畫布類中 paint(Graphics g)方法
- 呼叫 paint(Graphics g)方法 中的 Graphics物件 或 建立Graphics2D繪圖物件
- 呼叫 繪圖的抽象方法 實現繪圖
方式二:(從步驟4開始,適合批量繪圖)
- 例項 java.awt.geom包 中的圖形類,賦值至 Shape介面 物件
- 傳參 呼叫 Graphics2D類 中的 draw() 或 fill() 方法 實現繪圖
大致例子:
大致例子:
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RectangularShape;
public class DrawFrame extends JFrame {
private Container c = getContentPane();
public DrawFrame(){
setBounds(400 , 300 , 360 , 160);
setDefaultCloseOperation(3);
//Canvas匿名畫布類 重寫paint()繪圖方法
c.add(new Canvas(){
@Override
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D) g;
//方法一
g2.drawRoundRect(10 , 5 , 100 , 100 , 10 , 10);
g2.fillOval(20 , 15 , 80 , 80);
//方法二
//宣告圖形陣列
Shape[] shapes = new Shape[4];
//以double精度建立
//繪製圓
shapes[0] = new Ellipse2D.Double(120, 5 , 100 ,100);
//繪製矩形
shapes[1] = new Rectangle2D.Double(230 ,5 ,100 ,100);
//繪製矩形
shapes[2] = new Rectangle2D.Double(130 ,15 ,80 ,80);
//繪製圓
shapes[3] = new Ellipse2D.Double(240 ,15 ,80 ,80);
for(Shape tmp : shapes){
//Rectangle2D bounds = tmp.getBounds2D(); (Rectangle2D是RectangularShape的子類
//RectangularShape類 用來查詢和修改矩形框架的類
RectangularShape bounds = tmp.getBounds2D();
if(bounds.getWidth() == 80){
//第二組圖形建立
g2.fill(tmp);
}else{
//第一組圖形建立
g2.draw(tmp);
}
}
}
});
}
public static void main(String[] args) {
new DrawFrame().setVisible(true);
}
}
執行結果:
繪圖屬性
顏色
Class Color
java.lang.Object
java.awt.Color
Color類 提供設定顏色的物件
構造方法
Color(int R , int G , int B)
Color(int RGB)
引數說明
R: 紅色顏色值
G: 綠色顏色值
B: 藍色顏色值
RGB: 組合RGB顏色值
Color常量值 有已定義好的顏色物件,可直接呼叫(自行API查
public void paint(Graphics g){
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
//設定顏色
g.setColor(Color.RED);
···
}
畫筆
Class BasicStroke
java.lang.Object
java.awt.BasicStroke
BasicStroke類 為圖形輪廓定義基本渲染屬性(定義邊線屬性
實現前提需要Stroke介面實現類!!!
**構造方法 **
BasicStroke()
BasicStroke(float width)
BasicStroke(float width , int cap , int join)
BasicStroke(float width , int cap , int join , float miterlimit)
BasicStroke(float width , int cap , int join , float miterlimit , float[] dash , float dash_phase)
引數 | 說明 |
---|---|
width | 畫筆寬度 |
cap | 線端點的裝飾 |
join | 應用在路徑線段交會處的裝飾 |
miterlimit | 斜接處的剪裁限制 |
dash | 虛線模式的陣列 |
dash_phase | 開始虛線模式的偏移量 |
CAP引數 3個常量及標識
JOIN引數 3常量及標識
程式碼實現流程:
- 建立Stroke介面物件,例項BasicStroke物件
- 設定畫筆 setStroke(Stroke)方法
大致例子:
import javax.swing.*;
import java.awt.*;
public class BrushTest extends JFrame {
public BrushTest(){
setBounds(400 ,300 ,300 ,230);
setDefaultCloseOperation(3);
add(new MyCanvas());
}
class MyCanvas extends Canvas{
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
Stroke[] s = {
new BasicStroke(10 , BasicStroke.CAP_ROUND ,BasicStroke.JOIN_ROUND),
new BasicStroke(10 , BasicStroke.CAP_BUTT , BasicStroke.JOIN_ROUND),
new BasicStroke(10 , BasicStroke.CAP_SQUARE , BasicStroke.JOIN_ROUND),
new BasicStroke(10 , BasicStroke.CAP_BUTT , BasicStroke.JOIN_BEVEL)
};
// 圖形No.1
g2.setStroke(s[0]);
g2.drawLine(10,10 , 230,10);
g2.setStroke(s[1]);
g2.drawLine(10,30 , 230,30);
g2.setStroke(s[2]);
g2.drawLine(10,50 , 230,50);
// 圖形No.2
//更改顏色
g2.setColor(Color.CYAN);
g2.setStroke(s[3]);
int[] x = {20 ,200 ,20 ,200},
y = {80 ,80 ,180 ,180};
g2.drawPolyline(x , y , 4);
}
}
public static void main(String[] args) {
new BrushTest().setVisible(true);
}
}
執行結果: