Applet程式中所採用的AWT的繪圖機制主要涉及三個方法:paint()方法、update()方法和repaint()方法,update()方法和paint()方法都有一個Graphics類參數。Graphics是畫圖的關鍵,它可以支援兩種繪圖:一種是基本的繪圖,如:畫線、矩形、圓等;另一種是畫圖象,主要用於動畫製作。
要進行繪圖,首先要找到一個Graphics類的物件。update()方法和paint()方法所傳遞的參數都是Graphics類的物件,因此主要是通過重載它們來進行繪圖,這是在動畫程式中經常使用的方法。我們還可以通過getGraphics()方法得到一個Graphics類的物件,這個物件和update()方法和paint()方法中所傳遞的物件一樣,都是該成員所對應的Graphics類的對象。得到了Graphics類的物件,就可使用各種繪圖方法。
Graphics中提供的圖形繪製方法有:
paint( ) //進行繪圖的具體操作,必須有程式師重寫
update( ) //用於更新圖形,先清除背景、前景,再調用paint()
repaint( ) /*用於重繪圖形,在元件外形發生變化,即大小改變或位置移動時,repaint( )方法立即被系統自動調用,而實際上repaint()方法是自動調用update()方法*/
下面的方法支持基本的繪圖和畫圖像:
void drawLine( )
void drawArc( )
void drawPolygon( )
void drawRect( )
void drawRoundRect( )
void fill3DRect( )
void fillOval( )
java.awt.Graphics類
輸出文字:
void drawBytes( )
void drawChars( )
void drawString( )
import java.awt. event . * ;
import java.applet. * ;
public class ArcTest extends Applet implements WindowListener ... {
ArcControls controls;
pulic void init()...{ //Applet的入口方法
setLayout(new BorderLayout());
ArcCanvas c=new ArcCanvas();
Add("Center",c);
add("South",controls=new ArcControls(C));
}
public void start()...{
controls.setEnabled(true); //啟動controls
}
public void stop()...{
controls.setEnabled(false);
}
public void windowActivated(WindowEvent e)...{ }
//重寫WindowListener的方法
public void windowClosed(WindowEvent e)...{ }
//重寫WindowListener的方法
public void windowClosing(WindowEvent e)...{
//重寫WindowListener的方法
System.exit(0); }
public void windowDeactivated(WindowEvent e)...{}
//重寫WindowListener的方法
public void windowDeiconified(WindowEvent e)...{}
//重寫WindowListener的方法
public void windowIconified(WindowEvent e)...{ }
//重寫WindowListener的方法
public void windowOpend(WindowEvent e)...{ }
//重寫WindowListener的方法
public static void main(String args[]) ...{
Frame f=new Frame("ArcTest"); //構造Frame
ArcTest arcTest=new ArcTest(); //構造arcTest
atcTest.init();
arcTest.start();
f.add("Center",arcTest);
f.setSize(300,300);
f.show();
f.addWindowListener(arcTest);
}
}
class ArcCanvas extends Canvas ... { //類ArcCanvas
int startAngle=0;
int endAngle=45;
boolean filled=false;
Font font;
public void paint(Graphics g)...{
//paint方法,該方法的作用是在Canvas上畫圖
Rectangle r=getBounds();
int hlines=r.height/10;
int vlines=r.width/10;
g.setColor(Color.pink);
for(int i=1;i<=hlines;i++) ...{
g.drawLine(0,i*10,r.width,i*10);
}
for(int i=1;i<=vlines;i++) ...{
g.drawLine(i*10,0,i*10,r.height);
}
g.setColor(Color.red);
if(filled) ...{
g.fillArc(0,0,r.width-1,r.height-1,startAngle,endAngle); }
else ...{ g.drawArc(0,0,r.width-1,r.height-1,startAngle, endAngle);
}
g.setColor(Color.black);
g.setFont(font);
g.drawLine(0,r.height/2,r.width,r.height/2);
g.drawLine(r.width/2,0,r.width/2,r.height);
g.drawLine(0,,0,r.width,r.height);
g.drawLine(r.width,0,0,r.height);
int sx=10;
int sy=r.height-28;
g.drawString("S="+startAngle,sx,sy);
g.drawString("E="+ednAngle,sx,sy+14);
}
public void redraw(boolean filled,int start,int end)...{ //重畫方法
this.filled=filled;
this.startAngle=start;
this.endAngle=end;
repaint();
//通過調用repaint()方法,從而最終調用paint方法完成重畫
}
}
class ArcControls extends Panel implements ActionListener ... { //ArcControls類
TextFiled s;
TextFiled e;
ArcCanvas canvas;
public ArcControls(ArcCanvas canvas) ...{
Button b=null;
this.canvas=canvas;
add(s=new TextField("0",4));
add(e=new TextField("45",4));
b=new Button("Fill");
b.addActionListener(this);
add(b);
b=new Button("Draw");
b.addActionListener(this);
add(b);
}
public void actionPerformed(ActionEvent ev) ...{
//實現介面ActionListener的方法
String label=ev.getActionCommand();
canvas.redraw(label.equals("Fill"),
Integer.parseInt(s.getText(),trim()),
Integer.parserInt(e.getText().trim());
}
}