posts - 37, comments - 8, trackbacks - 0, articles - 0

          Java基礎:小應用程序Applet

          Posted on 2008-08-11 20:29 夢與橋 閱讀(1916) 評論(0)  編輯  收藏 所屬分類: java基礎
          1、執行步驟:首先被編譯成class文件,然后在HTML文件中用<applet></applet>標簽對進行加載,運行此HTML文件。可以使用java、appletviewer進行相應的操作:java  *.java和appletviewer *.html
          2、主要方法:
              (1)init():當Java第一次運行Applet時,系統調用此方法,進行全部的初始化工作,在Applet的生命周期中只運行一次。
              (2)start():init()方法之后自動調用,當離開頁面又返回時再度調用,可調用多次。start()方法用于創建、啟動及重新啟動小應用程序線程。
              (3)stop():當用戶離開包含小應用程序的頁面時自動調用,釋放Applet所占用的資源。
              (4)destop():當Web瀏覽器的Java解釋器重新載入HTML文件或關閉瀏覽器時,此方法被調用,完成小應用程序資源的釋放。
              (5)paint():用于繪制小應用程序的顯示區域,瀏覽器自動在start()方法之后調用此方法,另外如改變窗口大小或者Applet本身需要顯示信息時,主類創建的對象都會自動調用paint()方法。可以通過repaint()方法觸發paint()方法,動態地改變屏幕外觀。可多次被調用。
              (6)run():包含了線程的小應用程序的主要代碼。當小應用程序正在執行一個單獨線程時,瀏覽器在start()方法之后調用run()方法。
          3、Applet的安全機制(以防面試時被問及)
              (1)Applet永遠無法運行本地系統上的可執行程序。
              (2)Applet除了與所在的服務器聯系外,無法再同任何其他的服務器取得聯系。
              (3)Applet不能對本地文件進行讀寫操作。
              (4)除了本地系統上使用的Java版本號、操作系統名稱和版本、系統使用的特殊字符外,Applet不能獲取其他有關本地計算機的任何信息。
              (5)Applet的彈出窗口都會帶有一個警告信息。
          由于Applet是在JVM中解釋執行,而不是由用戶計算機的CPU直接運行,所以使這些安全規則成為可能。
          4、一個基本的程序實例:
              (1)創建Applet類:
          import javax.swing.*;
          import java.awt.*;
          import java.awt.event.*;
          public class AppletDemo extends JApplet implements ActionListener{
              
          private JPanel panel;
              
          private JLabel labelPhoto;
              
          private JLabel mess;
              String str;
              
          public JComboBox cmbSelect;
              
          private String strPhotoName[]={"images\\image1.jpg","images\\image2.jpg","images\\image3.jpg"};
              
          public void init(){
                  panel
          =new JPanel();
                  labelPhoto
          =new JLabel(new ImageIcon("images\\image1.jpg"));
                  cmbSelect
          =new JComboBox(strPhotoName);
                  mess
          =new JLabel();
                  cmbSelect.addActionListener(
          this);
                  panel.add(labelPhoto);
                  panel.add(cmbSelect);
                  panel.add(mess);
                  panel.setLayout(
          new FlowLayout(FlowLayout.CENTER,30,18));
                  getContentPane().add(panel);
              }

              
          public void actionPerformed(ActionEvent e) {
                  
          int iItem=cmbSelect.getSelectedIndex();
                  mess.setText(strPhotoName[iItem]);
                  labelPhoto.setIcon(
          new ImageIcon(strPhotoName[iItem]));
              }

          }
              (2)編譯Applet類得到字節碼文件
              (3)打包成jar文件:將不同目錄的文件壓縮并打包成一個帶.jar擴展名的檔案文件,可以減少Applet下載時間。當前例子中,字節碼所在的目錄下有一個images文件夾,將其打包為wzz.jar,命令如下:
                                                  jar cvf wzz.jar ApppletDemo.class images
              (4)將Applet包嵌入到HTML:
          Applet標簽的基本語法:<applet jar=jar文件.jar   code=類文件.class   codebase=class文件的路徑
                                             width=value  height=value   align=  alt=>
                                                              <param   name="參數名字"    value="參數值">
                                                              ....
                                                  </applet>
          當前例子是在某一個文件夾下創建html文件applet.html,并創建目錄wang,里面存放jar文件wzz.jar。代碼:
          <html>
          <applet archive=wzz.jar codebase=wang code=AppletDemo.class width=300 height=300></applet>
          </html>
              (5)執行Applet:可在安裝了JRE的本地機器上,通過瀏覽器執行,也可用JDK自帶的AppletViewer程序來運行和調試:AppletViewer a.html
          5、一個向Applet傳遞參數的簡單程序
          (1)applet  code:
          import java.applet.Applet;
          import java.awt.*;
          public class ParamAppletDemo extends Applet{
              
          private int age;
              
          private String name;
              
          private String like;
              
          public void init(){
                  age
          =Integer.parseInt(getParameter("age"));
                  name
          =getParameter("name");
                  like
          =getParameter("like");
              }

              
          public void paint(Graphics g){
                  g.drawString(
          "姓名:"+name+";年齡:"+age+";愛好:"+like,100,100);
              }

          }
          (2)html  code :
          <html>
          <head><title>信息檔案</title></head>
          <body>
          <h4>個人信息:</h4><hr>
          <applet code=ParamAppletDemo.class width=-300 height=300>
          <param name=age value=20>
          <param name=name value="孫悟空">
          <param name=like value="計算機、文學、體育">
          </applet>
          </body>
          </html>
          6、繪制字符串:
          import java.awt.Graphics;
          import java.awt.Color;
          import java.awt.FontMetrics;
          import java.awt.Font;
          import java.applet.*;
          public class StringPaintDemo extends Applet {
              
          //FontMetrics 類定義了字體規格對象
              
          //該對象封裝了有關在特定屏幕上呈現特定字體的信息
              FontMetrics FM;
              
          int Ascent,Descent,Width,AppletWidth,AppletHeight,X,Y;
              
          public void init(){
                  setBackground(Color.white);
          //背景為白色
                  AppletWidth=getSize().width;//取得顯示區域的寬度
                  AppletHeight=getSize().height;//取得顯示區域的高度
              }

              
          public void paint(Graphics g){
                  g.drawRect(
          00, AppletWidth-1, AppletHeight-1);//繪制邊框
                  g.setFont(new Font("黑體",Font.BOLD,32));//設置字型
                  FM=g.getFontMetrics();//取得FontMetrics類字體
                  Ascent=FM.getAscent();//取得Ascent
                  Descent=FM.getDescent();//取得Descent
                  Width=FM.stringWidth("繪圖基礎");//取得字符串寬度
                  
          //計算置中坐標
                  X=(AppletWidth-Width)/2;
                  Y
          =(AppletHeight-(Ascent+Descent))/2+Ascent;
                  g.drawString(
          "繪圖基礎", X, Y);//繪制字符串陰影
                  g.setColor(Color.green);
                  g.drawString(
          "繪圖基礎",X-2, Y-2);//繪制字符串前景
              }

          }

          知識參考:Baseline:字符串繪制的基底線。
                              Ascent:自基底線向上延伸的最大距離。
                              Descent:自基底線向下延伸的最大距離。
                              Leading:顯示字符和指定y坐標之間的距離。
                              Heigh:字符串高度,相當于Leading+Ascent+Descent。
                              Width:字符串寬度。
          7、一個顯示圖象的演示程序:
          import java.awt.*;
          import java.applet.*;
          public class ImageDemo extends Applet{
              Image picture;
              
          public void init(){
                  
          //getCodeBase()獲得基URL
                  picture=getImage(getCodeBase(),"1.jpg");
              }

              
          public void paint(Graphics g){
                  
          //drawImage()方法是把圖象一邊裝入內存,一邊顯示
                  g.drawImage(picture,50,50,this);
              }

          }
          8、利用Applet播放聲音:
          //下面這些代碼寫在一個Applet的子類中
          //AudioClip類在java.awt包中
          AudioClip soun=getAudioClip(getCodeBase(),"1.mid");
          g.drawString(
          "播放聲音",50,100);
          sound.loop();
          9、一個四等分圓的演示程序:
          //以下程序序來自黃斐編著的《Java面向對象程序設計》
          //繪制一個四等分的圓,分別用四種不同顏色(red、yellow、blue、green)區分
          //內切圓對應的起點坐標為(40,40)長度為220
          import java.awt.*;
          import java.applet.*;
          public class RectDemo extends Applet{
              
          int AppletWidth,AppletHeight;
              
          public void init(){
                  setBackground(Color.white);
          //設置背景色
                  AppletWidth=getSize().width;//取得顯示區域寬度
                  AppletHeight=getSize().height;//取得顯示區域高度
              }

              
          public void paint(Graphics g){
                  g.drawRect(
          0,0,AppletWidth-1,AppletHeight-1);
                  g.drawRect(
          39,39,221,221);
                  g.setColor(Color.red);
                  g.fillArc(
          40,40,220,220,0,90);//繪制填滿弧形0度到90度
                  g.setColor(Color.yellow);
                  g.fillArc(
          40,40,220,220,90,90);
                  g.setColor(Color.blue);
                  g.fillArc(
          40,40,220,220,180,90);
                  g.setColor(Color.green);
                  g.fillArc(
          40,40,220,220,270,90);
              }

          }
          10、要求用直方圖顯示學生成績統計數據。學生成績分為5個檔次,即優、良、中、及格、不及格。顯示區域為330*250,水平軸的坐標為(15,210)和(300,210),每個矩形塊的寬度為40,高度為C*35,C是成績比例,其值分別為10%、20%、40%、20%、10%,矩形之間的間隔為10。程序如下:
          //以下程序序來自黃斐編著的《Java面向對象程序設計》
          //學生成績管理程序演示
          //繪圖原則:背景圖應該最先繪制,其次才是繪制主要圖形或其他圖形
          import java.awt.*;
          public class Example extends java.applet.Applet {
              
          int AppletWidth,AppletHeight;
              
          int a=1,b=2,c=4,d=2,e=1;//abcde分別表示優、良、中、及格、不及格的比例
              public void init(){
                  setBackground(Color.white);
                  AppletWidth
          =getSize().width;//取得顯示區域的寬度
                  AppletHeight=getSize().height;
              }

              
          public void paint(Graphics g){
                  
          //g.drawRect(0,0,AppletWidth-1,AppletHeight-1);//繪制邊框
                  g.setFont(new Font("宋體",Font.PLAIN,14));//設置字型
                  g.drawString("信息管理班電子商務課程成績統計表",7535);
                  
          //畫出垂直坐標和標尺
                  g.drawLine(152015210);//繪制垂直線
                  g.drawLine(1517520175);
                  g.drawLine(
          1514020140);
                  g.drawLine(
          1510520105);
                  g.drawLine(
          15702070);
                  g.drawLine(
          15352035);
                  
          //用矩形塊的高度顯示成績比例
                  g.setColor(Color.lightGray);//背景色為淺灰
                  g.fillRect(25210-e*3540, e*35);
                  g.fillRect(
          75210-d*3540, d*35);
                  g.fillRect(
          125210-c*3540, c*35);
                  g.fillRect(
          175210-b*3540, b*35);
                  g.fillRect(
          225210-a*3540, a*35);
                  
          //用矩形框的高度顯示成績比例
                  g.setColor(Color.blue);//背景色為藍色
                  g.fillRect(25210-e*3540, e*35);
                  g.fillRect(
          75210-d*3540, d*35);
                  g.fillRect(
          125210-c*3540, c*35);
                  g.fillRect(
          175210-b*3540, b*35);
                  g.fillRect(
          225210-a*3540, a*35);
                  
          //繪制水平線
                  g.setColor(Color.black);
                  g.drawLine(
          15210300210);
                  g.drawString(
          "不及格"25230);
                  g.drawString(
          "及格"75230);
                  g.drawString(
          ""125230);
                  g.drawString(
          ""175230);
                  g.drawString(
          ""225230);
                  }

          }

          11、鼠標和鍵盤事件程序演示:
          import java.awt.*;
          import java.applet.Applet;
          public class MouseMode extends Applet{
              String mouseDownEvent
          =null;
              String mouseUpEvent
          =null;
              String mouseDragEvent
          =null;
              String keyUpEvent
          =null;
              String keyDownEvent
          =null;
              
          //鼠標事件
              public boolean mouseUp(Event eve,int x,int y){
                  mouseUpEvent
          ="mouseUp:"+x+","+y;
                  repaint();
                  
          return true;
              }

              
          public boolean mouseDrag(Event eve,int x,int y){
                  mouseDragEvent
          ="mouseDrag:"+x+","+y;
                  repaint();
                  
          return true;
              }

              
          public boolean mouseDown(Event eve,int x,int y){
                  mouseDownEvent
          ="mouseDown:"+x+","+y;
                  repaint();
                  
          return true;
              }

              
          //鍵盤事件
              public boolean keyDown(Event eve,int letter){
                  
          if(letter==27)//ESC鍵
                      keyDownEvent="Esc鍵被按下";
                  
          else
                      keyDownEvent
          ="keyDown:"+(char)letter;
                  repaint();
                  
          return true;
                  }

              
          public boolean keyUp(Event eve,int letter){
                  
          if(letter==27)//ESC鍵
                      keyUpEvent="Esc鍵被釋放";
                  
          else
                      keyUpEvent
          ="keyUp:"+(char)letter;
                  repaint();
                  
          return true;
                  }

              
          //繪圖
              public void paint(Graphics g){
                  
          if(mouseUpEvent!=null)
                      g.drawString(mouseUpEvent, 
          545);
                  
          if(mouseDownEvent!=null)
                      g.drawString(mouseDownEvent, 
          575);
                  
          if(mouseDragEvent!=null)
                      g.drawString(mouseDragEvent, 
          515);
                  
          if(keyDownEvent!=null)
                      g.drawString(keyDownEvent, 
          595);
                  
          if(keyUpEvent!=null)
                      g.drawString(keyUpEvent, 
          5125);
              }

          }

          12、將應用程序轉換成Applet的方法:
              (1)把JFrame派生類替換為JApllet類
              (2)刪除main()方法
              (3)將所有初始化代碼從構造函數剪切到Apllet的init()方法中
              (4)刪除所有顯示或關閉窗體的方法:show()或setVisible() 、setDefaultCloseOpertation,另外如setsize()、setTitle()也要刪除,因為Applet的大小是在HTML中由網頁設置,其標題由裝載它的網頁設定。
              (5)去掉不安全操作,使之符合Applet安全規則,否則會拋出異常。
              (6)創建一個HTML頁面,作為Applet的載體,并設置顯示 Applet在網頁中的位置和大小。

                  演示程序:
          應用程序代碼:

          import javax.swing.*;
          import java.awt.*;
          public class GridLayoutDemo extends JFrame{
              JPanel p;
              JButton b1,b2,b3,b4;
              JTextArea ta;
              JTextField tf;
              
          public GridLayoutDemo(){
                  
          super("流布局演示");
                  setSize(
          250,150);
                  p
          =new JPanel();
                  p.setLayout(
          new GridLayout(3,2));
                  getContentPane().add(p);
                  b1
          =new JButton("one");
                  b2
          =new JButton("two");
                  b3
          =new JButton("three");
                  b4
          =new JButton("four");
                  ta
          =new JTextArea("JTextArea");
                  tf
          =new JTextField("JTextField");
                  p.add(b1);
                  p.add(b2);
                  p.add(b3);
                  p.add(b4);
                  p.add(ta);
                  p.add(tf);
                  setVisible(
          true);
                  
              }

              
          public static void main(String[] args) {
                  
          new GridLayoutDemo();
              }

          }
          轉換后的Applet代碼:
          import javax.swing.*;
          import java.awt.*;
          public class GridBagLayoutDemo extends JApplet{
              JPanel p;
              JTextArea ta;
              JTextField tf;
              JButton b1,b2;
              JLabel l1,l2;
              GridBagConstraints gbc;
              GridBagLayout gbl;
              
          public void init(){
                  p
          =new JPanel();
                  gbc
          =new GridBagConstraints();
                  gbl
          =new GridBagLayout();
                  p.setLayout(gbl);
                  getContentPane().add(p);
                  ta
          =new JTextArea("我是文本域",5,10);
                  b1
          =new JButton("我是按鈕b1.");
                  b2
          =new JButton("我是按鈕b2");
                  tf
          =new JTextField("我是文本框");
                  l1
          =new JLabel("我是一個標簽");
                  l2
          =new JLabel("我是另一個標簽");
                  
          //布局JTextArea
                  gbc.weightx=0;//指定如何分布額外的水平空間
                  gbc.weighty=0;//指定如何分布額外的垂直空間
                  
          //BOTH:在水平方向和垂直方向上同時調整組件大小
                  
          //fill:當組件的顯示區域大于它所請求的顯示區域的大小時使用此字段
                  gbc.fill=GridBagConstraints.BOTH;
                  addComponent(ta,gbl,gbc,
          0,0,1,3);
                  
          //布局按鈕b1
                  gbc.fill=GridBagConstraints.HORIZONTAL;
                  addComponent(b1,gbl,gbc,
          1,0,2,1);
                  
          //布局按鈕b2
                  gbc.fill=GridBagConstraints.HORIZONTAL;
                  addComponent(b2,gbl,gbc,
          1,1,2,1);
                  setVisible(
          true);
                  
          //布局文本框tf
                  gbc.fill=GridBagConstraints.BOTH;
                  addComponent(tf,gbl,gbc,
          1,2,2,1);
                  setVisible(
          true);
                  
          //布局標簽l1
                  gbc.fill=GridBagConstraints.BOTH;
                  addComponent(l1,gbl,gbc,
          0,3,2,1);
                  setVisible(
          true);
                  
          //布局標簽l2
                  gbc.fill=GridBagConstraints.BOTH;
                  addComponent(l2,gbl,gbc,
          1,3,2,1);
                  setVisible(
          true);p=new JPanel();
                  gbc
          =new GridBagConstraints();
                  gbl
          =new GridBagLayout();
                  p.setLayout(gbl);
                  getContentPane().add(p);
                  ta
          =new JTextArea("我是文本域",5,10);
                  b1
          =new JButton("我是按鈕b1.");
                  b2
          =new JButton("我是按鈕b2");
                  tf
          =new JTextField("我是文本框");
                  l1
          =new JLabel("我是一個標簽");
                  l2
          =new JLabel("我是另一個標簽");
                  
          //布局JTextArea
                  gbc.weightx=0;//指定如何分布額外的水平空間
                  gbc.weighty=0;//指定如何分布額外的垂直空間
                  
          //BOTH:在水平方向和垂直方向上同時調整組件大小
                  
          //fill:當組件的顯示區域大于它所請求的顯示區域的大小時使用此字段
                  gbc.fill=GridBagConstraints.BOTH;
                  addComponent(ta,gbl,gbc,
          0,0,1,3);
                  
          //布局按鈕b1
                  gbc.fill=GridBagConstraints.HORIZONTAL;
                  addComponent(b1,gbl,gbc,
          1,0,2,1);
                  
          //布局按鈕b2
                  gbc.fill=GridBagConstraints.HORIZONTAL;
                  addComponent(b2,gbl,gbc,
          1,1,2,1);
                  setVisible(
          true);
                  
          //布局文本框tf
                  gbc.fill=GridBagConstraints.BOTH;
                  addComponent(tf,gbl,gbc,
          1,2,2,1);
                  setVisible(
          true);
                  
          //布局標簽l1
                  gbc.fill=GridBagConstraints.BOTH;
                  addComponent(l1,gbl,gbc,
          0,3,2,1);
                  
          //布局標簽l2
                  gbc.fill=GridBagConstraints.BOTH;
                  addComponent(l2,gbl,gbc,
          1,3,2,1);        
              }

              
          private void addComponent(Component c,GridBagLayout g
                      ,GridBagConstraints gc,
          int column ,int row,int width,int height)
              
          {
                  gc.gridx
          =column;//指定包含組件的顯示區域開始邊的單元格
                  gc.gridy=row;//指定位于組件顯示區域的頂部的單元格
                  gc.gridwidth=width;//指定在組件顯示區域的一行中的單元格數
                  gc.gridheight=height;//指定在組件顯示區域的一列中的單元格數
                  g.setConstraints(c, gc);//設置此布局中指定組件的約束條件
                  p.add(c);
              }

              }

          主站蜘蛛池模板: 西乡县| 金山区| 苏尼特左旗| 昭通市| 东丰县| 莱阳市| 夏邑县| 巨鹿县| 达孜县| 开化县| 柳江县| 沙田区| 盐津县| 汉中市| 永春县| 于都县| 祁东县| 新郑市| 奉化市| 兴山县| 长沙县| 息烽县| 利川市| 怀宁县| 吴桥县| 方山县| 巩留县| 竹溪县| 洪泽县| 边坝县| 富裕县| 柯坪县| 茂名市| 彰武县| 慈利县| 城步| 即墨市| 巍山| 邹城市| 达孜县| 清苑县|