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

Java基础:小应用程序Applet

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

    }


只有注册用户登录后才能发表评论。


网站导航: