|
Posted on 2008-08-11 20:29 梦与桥 阅读(1901) 评论(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);
}
}
|