Graphics2D學習

Java語言在Graphics類提供繪製各種基本的幾何圖形的基礎上,擴展Graphics類提供一個Graphics2D類,它擁用更強大的二維圖形處理能力,提供、座標轉換、顏色管理以及文字佈局等更精確的控制。

Graphics2D定義了幾種方法,用於添加或改變圖形的狀態屬性。可以通過設定和修改狀態屬性,指定畫筆寬度和畫筆的連接方式;設定平移、旋轉、縮放或修剪變換圖形;以及設定填充圖形的顏色和圖案等。圖形狀態屬性用特定的對象存儲。

1. stroke屬性
stroke屬性控制線條的寬度、筆形樣式、線段連接方式或短劃線圖案。該屬性的設置需要先創建BasicStroke對象,再調用setStroke()方法來設置。創建BasicStroke對象的方法有:

  • BasicStroke(float w):指定線條寬w。
  • BasicStroke(float w,int cap, int join):
    • cap是端點樣:CAP_BUTT(無修飾),CAP_ROUND(半圓形末端),CAP_SQUARE(方形末端,默認值)。
    • Join定義兩線段交匯處的連接方式:JOIN_BEVEL(無修飾),JOIN_MTTER(尖形末端,默認值),JOIN_ROUND(圓形末端)。

2. paint屬性
paint屬性控制填充效果。先調用以下方法確定填充效果,理用setPaint()方法設置。
  • GradientPaint(float x1,float y1,Color c1,float x2,flaot y2,Color c2):從(x1,y1)到(x2,y2)顏色從c1漸變到c2。其中:參數c1,c2決定這個漸變色是從顏色c1漸變到顏色c2。參數x1,y1,x2,y2決定了漸變的強弱,即要求從點(x1,y1)出發到達點(x2,y2),顏色從c1變成c2。
  • GradientPaint(float x1,float y1,Color c1,float x2,float y2,Color c2,Boolean cyclic):如果希望漸變到終點又是起點的顏色,應將cyclic設置爲true。

3. transform屬性
transform 屬性用來實現常用的圖形平移、縮放和斜切等變換操作。首先創建AffineTransform對象,然後調用setTransform()方法設置transform屬性。最後,用具有指定屬性的Graphics2D對象繪製圖形。創建AffineTransform對象的方法有:
  • getRotateinstrance(double theta):旋轉theta弧度。
  • getRotateInstance(double theta,dioble x,double y):繞旋轉中心(x,y)旋轉。
  • getScaleInstance(double sx,double sy):x和y 方向分別按sx,sy比例變換。
  • getTranslateInstance(double tx,double ty):平移變換。
  • getShearInstance(double shx,double shy):斜切變換,shx和shy指定斜拉度。

也可以先創建一個沒有transform屬性的AffineTransform對象,然後用以下方法指定圖形平移、旋轉、縮放變換屬性。
  • transelate(double dx,double dy):將圖形在x軸方向平移dx像素。
  • scale(double sx,double sy):圖形在x軸方向縮放sx倍,縱向縮放sy倍。
  • rotate(double arc,double x, double y):圖形以點(x,y)爲軸點,旋轉arc弧度。

例如,創建AffineTransform對象:
    AffineTransform trans = new AffineTransform();
爲AffineTransform對象指定繞點旋轉變換屬性:
    Trans.rotate(50.0*3.1415927/180.0,90,80);
接着爲Graphics2D 的對象g2d設置具有上述旋轉變換功能的“畫筆”:
    Graphics2D g2d = (Graphics2D)g;g2d.setTranstorm(trans);
最後,以圖形對象爲參數調用具有變換功能的Graphics2D 對象的draw()方法。例如,設已有一個二次曲線對象curve,以下代碼實現用上述旋轉功能的g2d對象繪製這條二次曲線:
    g2d.draw(curve);

4. clip屬性
clip屬性用於實現剪裁效果。設置剪裁屬性可調用setClip()方法確定剪裁區的Shape。連續多個setClip()得到它們交集的剪裁區。

5. composit屬性
composit屬性設置圖形重疊區域的效果。先用方法AlphaComposite.getInstance(int rule, float alpha)得到AlphaComposite對象,再通過setComposite()方法設置混合效果。Alpha值的範圍爲0.0f(完全透明)-0.1f(完全不透明)。


以上截至別人的博客,博客地址是:http://www.weixueyuan.net/view/6074.html


其實看起來挺好用的一個功能,但是我花了一個小時寫一個小程序,就是畫一個方框

大家先看我的代碼:

import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;





/*這個程序是爲了學習Graphics畫圖庫*/
public class a
{

	public static void main(String[] args)
	{
		drawFrame aframe = new drawFrame();
		aframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		aframe.setVisible(true);
	}
}	

class drawFrame extends JFrame
{

	public drawFrame()
	{
		
		
		Toolkit tk = Toolkit.getDefaultToolkit();
		int witdth = (int) tk.getScreenSize().getWidth();
		
		int height = (int) tk.getScreenSize().getHeight();
		
		setSize(witdth/2,height/2);
		setLocation(witdth/4, height/4);
		
		DrawPanel apane = new DrawPanel();
		Container cc = getContentPane();
		cc.add(apane);

	}
}

class DrawPanel extends JPanel
{

	public void cc(Graphics g)
	{
		Graphics2D g2 = (Graphics2D)g;
        
        double leftX = 100;
        double topY = 100;
        double width = 200;
        double height = 150;
        
        Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
        g2.draw(rect);
        
        System.out.print("fuck you!!");
	}
}





其實很簡單的一個程序,但是發現怎麼都跑不出來,爲什麼,單步執行,發現根本就沒有執行最後一個類,根本就沒有進入。查了好半天,發現有個問題,就是
DrawPanel 
類,中間的cc函數沒有被執行,難道有問題,可是就這簡單的幾句話,咋辦!!!!!!!!!!!

查了半天發現需要使用public void paintComponent(Graphics g)這個函數

現在瞭解一下這個函數

paintComponent是Jcomponent下的一個函數

也就是說當Swing中的paint方法被調用時,paintComponent、paintBorder、paintChildren這三個方法也會被按順序調用,之所以要按這個順序調用是爲了保證子組件能正確地顯示在目前這個組件之上。

所以paintComponent就是本身這個容器自己畫出自己組件的方法了。如果只是爲了改變本身這個容器中的組件,只需要改寫paintComponent方法就可以了,如果還要保留容器中的原本組件就別忘了調用super.paintComponent(g)。如果要改寫paint方法來改變本身這個容器的組件,那麼也別忘了要調用super.paint(g),不然出來的東西是不包含原組件、原邊框和子組件的。


發佈了105 篇原創文章 · 獲贊 10 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章