要進行繪圖,首先要找到一個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( )
Applet 的AWT繪製舉例如下:
例6.10
import java.awt.*;
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());
}
}
Applet與瀏覽器間的通信
在Applet類中提供了許多方法,使之可以與瀏覽器進行通信。下面對這些方法進行簡要的介紹:
一個Web頁可包含一個以上的小應用程序。一個Web頁中的多個小應用程序可以直接通過java.applet包中提供的方法進行通信。
getDocumentBase( ) //返回當前網頁所在的URL
getCodeBase( ) //返回當前applet所在的URL
getImage(URL base,String target) //返回網址URL中名爲target的圖像
getAudioClip(URL base,String target)
//返回網址URL中名爲target的聲音對象
getParameter(String target ) //提取HTML文件中名爲target的參數的值
同頁Applet間的通信
在java.applet.Applet類中提供瞭如下方法得到當前運行頁的環境上下文AppletContext對象。
public AppletContext getAppletContext();
通過AppletContext對象,可以得到當前小應用程序運行環境的信息。AppletContext是一個接口,其中定義了一些方法可以得到當前頁的其它小應用程序,進而實現同頁小應用程序之間的通信。
(1)得到當前運行頁的環境上下文AppletContext對象
public AppletContext getAppletContext();
(2)取得名爲name的Applet對象
public abstract Applet getApplet(String name);
(3)得到當前頁中所有Applet對象
public abstract Enumeration getApplets();
例6.11
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Enumeration;
public class GetApplets extends Applet implemements ActionListener {
private TextArea textArea; //聲明一個TextArea
private String newline;
public void init() {
Button b=new Button("Click to call getApplets()");
b.addActionListener(this);
setLayout(new BorderLayout());
add("North",b);
textArea=new TextAred(5,40);
textArea.setEditable(false);
add("Center",textArea);
newline=System.getProperty("line,separator");
//取得系統當前的換行符
}
public void actionPerformed(ActionEvent event) {
/*Button b點擊後的事件處理函數*/
printApplets();
}
public String getAppletInfo() {
return "GetApplets by Dong.li";
}
public void printApplets()}
Enumeration e=getAppletContext().getApplets();
/*得到當前網頁所有的Applet對象*/
textArea.append("Results of getApplets():" + newline);
while(e.hasMoreElements()) {
Applet applet=(Applet) e.nextElement();
String info=((Applet)applet).getAppletInfo();
/*逐個取得當前網頁Applet對象的信息*/
if (info!=null) {
textArea.append("-"+info+newline);
/*在textArea中輸出網頁所有Applet的信息*/
} else {
textArea.append("-"+applet.getClass().getName()+newline) ;
}
}
textArea.append("__________"+newline+newline);
}
}