Applet和AWT

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( )

  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);
       }
   }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章