Applet类
java小程序Applet运行在Web浏览器,即它可以嵌入在IE或Netscapore中运行,作为Web浏览器的一部分使用
使用Applet可以为网页添加许多丰富、有用的功能
1.类层次关系
Applet程序通过Applet继承产生,即需要使用语句:
import java.applet.Applet;
2.Applet的开始和结束
applet的开始是随着含有applet程序的网页加载而开始,此时完成初始化和启动
用户离开此页面时applet停止运行
关闭浏览器或重新加载该网页时applet终止
Applet的活动周期如图:
3.主要成员变量
- appletURL:applet对应的URL,URL(Uniform Resource Locator)统一资源定位器,是计算机Web网络相关的术语,就是网页地址的意思。
- documentURL:包含applet的网页所对应的URL,可以得到浏览器网页所在的地址
- fgColor:显示前景色
- gColor:显示背景色
- font:显示字体
- height:applet显示区域高度
- width:applet显示区域宽度
- item:显示applet的AppletDisplayItem框架名
- tag:调用applet的HTML标记
4.主要成员方法
方法名称 | 描述 | 参数 |
---|---|---|
void destroy() | 撤销 | |
void init() | 初始化 | |
void start() | 开始 | |
void stop() | 停止 | |
AppletText getAppletContext() | 返回Applet环境 | |
String getAppletInfor() | 返回Applet信息 | |
URL getCodeBase() | 返回applet本身的URL | |
URL getDocumentBase() | 返回html文档的URL | |
String getParamenter(String name) | 返回html中传给applet的参数 | name - 参数名称 |
String [ ][ ] getParamenterInfor() | 返回参数信息 | |
Audioclip getaudioClip(URL url) | 返回声音片段对象 | url - 声音文件的URL |
Audioclip getaudioClip(URL url,String name) | 返回声音片段对象 | url - 声音文件的URL,name - 文件名称 |
Image getImage(URL url) | 返回图形对象 | url - 图形文件的URL |
Image getImage(URL url) | 返回图形对象 | url - 图形文件的URL,name - 文件名称 |
void showStatus(String msg) | 在浏览器状态栏显示状态信息 | msg - 信息文字 |
Applet程序结构与运行
1.Applet程序格式
Applet程序因为没有main()函数所以不能单独运行,必须由web浏览器调用执行。程序基本结构如下:
import java.awt.*;
import java.applet.*;
public class 类名 extends Applet
{
//程序装载时被调用
public void init()
{
...
}
//HTML文档关闭时被调用
public void stop()
{
...
}
//HTML文档显示时被调用
public void start()
{
...
}
//HTML浏览器退出时被调用
public void destroy()
{
...
}
//applet显示时被调用
public void paint(Graphics g)
{
...
}
}
2.运行Applet小程序
运行小程序必须要有HTML文件,java小程序是嵌入在网页中,必须由www浏览器调用执行
3.Applet程序编写方法
- 给类取一个名字,然后由Applet类派生,先写出类的框架:
public class 类名称 extends Applet
{
//在此处填入变量
//在此处填入方法
......
}
- 定义一些你的程序所需要的变量
- 考虑从哪里开始你的任务,如果有一次性的初始设置的变量或操作,应在init()方法进行
4.图像显示和声音播放
图像显示
可以在Java中显示一幅图像,操作步骤如下: - 定义一个Image变量
- 用applet的getImage()方法装入图像
- 使用Graphics对象的drawImage( )方法绘制图像
播放声音
在Applet中提供通过AudioClip接口类和play()方法来播放一段音乐。具体方法如下:
play()方法播放:
法一:
public void play(URL soundUrl)
法二:
public void play(URL soundUrl,String soundName)
参数soundUrl为声音文件所在的地址,soundName为声音文件名称
通过AudioClip接口类播放声音:
Audio是一个接口,它提供一些方法供播放声音使用
法一:
AudioClip getAudioClip(URL url)
法二:
AudioClip getAudioClip(URL url,String name)
参数url为声音文件所在的地址,name为声音文件名称
AudioClip接口方法主要有三个方法:
函数名 | 函数作用 |
---|---|
void play( ) | 开始播放,从头开始 |
void loop( ) | 反复循环播放 |
void stop( ) | 停止播放 |
播放音乐小程序:
import java.awt.*;
import java.applet.*;
public class music extends Applet
{
public void paint(Graphics g)
{
g.setColor(Color.blue);
g.drawString("在applet直接播放声音",50,60)
//两个数字代表出现这些字的像素位置
g.setColor(Color.red);
play(getCodeBase(),"sound/yahoo1.au");
play(getCodeBase(),"sound/music.au");
}
}
线程
线程是程序中单独顺序的流控制,线程本身不能运行,它只能用于程序中
Thread对象
每个线程都与线程类的一个实例关联
java的线程是通过java的软件包java.lang中定义的类Thread来实现的
1.线程体
- 线程的所有活动都是通过线程体run()方法来实现的
- 在一个线程被建立并初始化以后,java的运行时系统就自动调用run( )方法,正是通过run( )方法才使得建立线程的目的得以实现
- 通常run( )方法是一个循环,有两种方法可以构造用户自己的run()方法
2.线程的状态
- 在一个线程的生命周期中,它总处于某一种状态中
- 线程的状态表示了线程正在进行的活动以及在这段时间内线程能完成的任务
java线程所具有的不同状态及各状态间进行转换所需调用的方法
(1)创建状态(new Thread)
线程的声明方法:
Thread myThread = new MyThreadClass();
由于没有启动这一线程,所以当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源,处于这种状态时只能启动或终止该线程,调用除这两种以外的其他方法都会失败并且会引起非法状态处理
(2)可运行状态(Runnable)
Thread myThread = new MyThreadClass();
myThread.start();
其中start( )方法产生了运行这个线程所需的系统资源,安排并运行,并调用线程体-run()方法,这样就使得该线程处于可运行 ( Runnable ) 状态
(3)不可运行状态
当下面四种情况发生时,线程就进入不可运行状态:
- 调用了sleep()方法
- 调用了suspend()方法
- 为等候一个条件变量,线程调用wait()方法
- 输入输出流中发生线程阻塞
示例程序:
Thread myThread = new MyThreadClass();
myThread.start();
try{
myThread.sleep(10000);
}catch(InterruptedException e){
}
(4)死亡状态
线程的终止一般可通过两种方法实现:自然撤销或是被停止
自然撤销是指从线程的run()方法正常退出,如:
public void run()
{
int i=0;
while(i<100)
{
i++;
System.out.println("i = " + i );
}
}
当run( )方法结束后,该线程就自然撤销
3.构造线程体
创建新执行线程有两种方法:
- 一种方法是将类声明为Thread的子类。该子类应重写Thread类的run方法。接下来可以分配并启动该子类的实例
- 另一种方法是声明实现Runnable接口的类。该类实现run方法,并分配该类的实例,在创建Thread时作为一个参数来传递并启动
java的线程是通过java.lang中定义的类Thread和Runnable接口来实现的。类Thread的主要成员见下所列:
构造方法 |
---|
Thread() |
Thread(Runnable target) |
Thread(Runnable target,String name) |
Thread(String name) |
Thread(ThreadGroup group,Runnable target) |
Thread(ThreadGroup group,Runnable target,String name) |
target是实现Runnable接口的类的对象。name是线程的名字。
每个线程都有一个标识名,多个线程可以同名
如果线程创建时没有指定标识名,就会为其生成一个新名称
方法 | 作用 |
---|---|
void run() | 如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则该方法不执行任何操作并返回 |
static void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行) |
void start () | 使该线程开始执行,java虚拟机调用该线程的run方法 |
void stop () | 强迫线程停止执行,已过时 |
void suspend() | 挂起线程,已过时 |
void run() | 使用实现接口Runnable的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的run方法 |
通过继承构造线程
可以建立一个类Thread的子类,通过继承类Thread并覆盖其run()方法和其他方法来构造线程体
示例如下:
class TwoThreadTest
{
public static void main(String args[])
{
new SimpleThread("Jamaica").start();//启动线程
new SimpleThread("fiji").start();//启动线程
}
}
通过接口构造线程体
通过建立一个实现了Runnable接口的对象,并以它作为线程的目标对象也可以构造线程体
4.同步与共享
经常有一些同时运行的线程需要共享数据,例如一个线程向文件写数据,而同时另一个线程从同一文件中读取数据,因此就必须考虑其它线程的状态与行为,这时就需要实现同步来得到预期结果。
Java用监视器的手段来完成线程的同步。监视器将受保护的资源外面加了一把锁,而这把锁只有一把钥匙,每一个线程只有在得到这把钥匙之后才可以对被保护的资源执行操作,这线程执行操作完成之后,再将这把钥匙交给下一个即将对所要保护资源进行操作的线程,而其他的线程只能等待,直到拿到这把钥匙。
关键字synchronized
- Java中用关键字synchronized来完成监视器(monitor)这一角色
- 关键字synchronized,系统将为其设置一个内部标记。这个标志起着信号量的作用,每当调用该方法时,Java运行时系统都将进行检查,以确认此标志的状态。确认相应代码是否已被调用。如果没有,系统把标志授予调用对象,方法可以运行。
- 运行结束后标志被释放。在此标志未被释放前,任何其他对象通常不能调用此方法
synchronize代码声明方式:
synchronize 方法类型 方法名称(参数)
{
需要进行同步的代码
}
synchronize除了用在方法声明,同样也可以用在代码段
在synchronize代码段的声明方法:
synchronize (被锁定的对象)
{
需要进行同步的代码
}
示例程序:
public class CubbyHole
{
private int contents;
private boolean available = false;
public synchronized int get(int who)
{
while(available == false){
try{
wait();
}catch(InterruptedException e){}
}
available = false;
notifyAll();
return contents;
}
}
wait()和notify()方法
wait()和notify()方法用于线程的同步。可以在synchronize方法中调用
方法 | 作用 |
---|---|
wait( ) | 将导致当前线程处于等待状态,直到其他线程调用此对象的notify( )或notifyAll( )方法唤醒此线程,否则线程将永远等待下去(此方法只应由作为此对象监视器的所有者来调用 |
notify( ) | 方法唤醒在此对象监视器上等待的单个进程 |
- 如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意性的,并在对实现做出选择时发生
- 线程通过调用其中一个wait方法,在对象的监视器上等待直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程
- 被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争
通过下列三种方法之一,线程可以成为此对象监视器的所有者:
- 通过执行此对象的同步实例方法
- 通过执行在此对象上进行同步的synchronize语句的正文
- 对于Class类型的对象,可以通过执行该类的同步静态方法
java图形用户界面( GUI )
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具。
GUI界面组成
1.GUI界面的组成
java程序中图形界面由容器、布局、组件和事件处理构成
- 容器
用于容纳或包含组件和作为子容器的其他容器 - 布局
用于安排容器内组件排列顺序和样式,是组件的布局管理器 - 组件
用于输入和输出的界面构件,是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互
典型图形用户界面中的部件:按钮、复选框和滚动条 - 事件
由硬件和组件发出的命令
容器
容器是一种可以容纳其他组件的组件,AWT中的所有组件都是从Container类派生而来
在GUI中容器有顶层容器和非顶层容器
容器 | 含有的包 |
---|---|
顶层容器 | Frame,JFrame,JDialog,Applet,JApplet |
非顶层容器 | Panel,JPanel,Canvas |
Java内置GUI Frame类
java中JFrame类的简介
布局管理
当把组件放入容器时,容器通过布局对象来管理组件,控制组件的位置和尺寸
通常每个容器或组件均有相关的布局对象,也可以根据需要创建合适组件的布局对象
GUI用到的布局有:
常用布局的编排格式:
2.创建GUI界面
在java中,图形界面由容器、布局和组件组成,各种组件在布局的管理下自动排列,通过事件处理使得用户可以控制组件,进行交互
构建图形用户界面的一般步骤:
- 设计界面样式
- 分解界面,使之成为符合GUI容器、布局的基本样式
- 选择容器以及与之相对应的布局管理
- 创建组件,加入组件到相应容器
- 注册事件处理对象,实现事件处理
3.使用顶层容器
在awt中顶层容器只有Frame,Swing提供了顶层JFrame,JDialog和JApplet - 出现在屏幕上的每个GUI组件必须是包容层次结构的一部分。包容层次结构是一个树结构,顶层容器位于其根
- 每个GUI组件可只能被包含一次。如果组件已在容器中并且您尝试将他添加到另一个容器,您需要将它从第一容器中移除,然后将其添加到第二个
- 每个顶级容器都有一个内容面板(Pane),通常包含顶层容器GUI中可见的组件
GUI层次结构
使用Swing组件的每个程序都有至少一个的顶级容器