|
Posted on 2008-08-11 20:29 夢與橋 閱讀(1910) 評論(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(0, 0, 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("信息管理班電子商務課程成績統計表",75, 35);
//畫出垂直坐標和標尺
g.drawLine(15, 20, 15, 210);//繪制垂直線
g.drawLine(15, 175, 20, 175);
g.drawLine(15, 140, 20, 140);
g.drawLine(15, 105, 20, 105);
g.drawLine(15, 70, 20, 70);
g.drawLine(15, 35, 20, 35);
//用矩形塊的高度顯示成績比例
g.setColor(Color.lightGray);//背景色為淺灰
g.fillRect(25, 210-e*35, 40, e*35);
g.fillRect(75, 210-d*35, 40, d*35);
g.fillRect(125, 210-c*35, 40, c*35);
g.fillRect(175, 210-b*35, 40, b*35);
g.fillRect(225, 210-a*35, 40, a*35);
//用矩形框的高度顯示成績比例
g.setColor(Color.blue);//背景色為藍色
g.fillRect(25, 210-e*35, 40, e*35);
g.fillRect(75, 210-d*35, 40, d*35);
g.fillRect(125, 210-c*35, 40, c*35);
g.fillRect(175, 210-b*35, 40, b*35);
g.fillRect(225, 210-a*35, 40, a*35);
//繪制水平線
g.setColor(Color.black);
g.drawLine(15, 210, 300, 210);
g.drawString("不及格", 25, 230);
g.drawString("及格", 75, 230);
g.drawString("中", 125, 230);
g.drawString("良", 175, 230);
g.drawString("優", 225, 230);
}
}

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, 5, 45);
if(mouseDownEvent!=null)
g.drawString(mouseDownEvent, 5, 75);
if(mouseDragEvent!=null)
g.drawString(mouseDragEvent, 5, 15);
if(keyDownEvent!=null)
g.drawString(keyDownEvent, 5, 95);
if(keyUpEvent!=null)
g.drawString(keyUpEvent, 5, 125);
}
}

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

|