Designed by Chiyong,?20051
Java2 网络编程基础
Applet和 图形编程第八章
Designed by Chiyong,?20052
回顾
Java最新的事件处理方法是基于授权事件模型。
事件是描述事件源状态变化的对象。用户与 GUI组件交互就会生成事件。
事件源是一个生成事件的对象。当这个对象的内部状态改变时,事件就会发生。
在发生事件时,事件源将调用监听器定义的相应方法。
Designed by Chiyong,?20053
目标
了解 applet的运行机制
解释图形的绘制
描述 Graphics 对象
了解 Font 类
了解 FontMetrics 类
了解 Color 类
掌握绘制各种图形的方法
Designed by Chiyong,?20054
World Wide Web( WWW)
文本,图象和声音的集成
Designed by Chiyong,?20055
超文本标识语言 (HTML)
WEB 上的信息使用 HTML ( 超文本标记语言 Hypertext Markup
Language)页来显示 信息。
HTML是一种基于文本的标记语言。使用 HTML 语言描述文档,
可以将文档划分为不同的显示区域 。
你可以通过点击链接,在页面间移动。
HTML
页 1
HTML
2
HTML
3
HTML
4
链接链接链接
Designed by Chiyong,?20056
HTML是如何工作的?
编写 HTML
HTML 文档
Browser显示该文档
放到网上的文件,首先要使用 HTML进行编写。
然后这些 HTML文档被上载 ( uploaded) 到站点上。
这些文档能被网上的任何用户通过浏览器来观看其内容。
Designed by Chiyong,?20057
Java applet
使用 HTML 编写网页的问题,
其表示的内容是静态的。
只用于定位,不能显示动画。
Java applet 支持的动态行为包括下面的形式:
滚动文本 ( Scrolling Text) 。
状态栏上显示的消息 。
动画 。
Designed by Chiyong,?20058
解决方案为了在网页上实现动态行为,一个解决方案就是使用
applet 。
Java applet 是用 Java编写的小应用程序,它能够嵌入在
HTML网页中,并由支持 Java的 Web浏览器来解释执行。
我们能够写一个 applet 来显示移动的文本和图象。
Displaying
moving images
and text
Designed by Chiyong,?20059
Java Applet 工作原理
HTML
文件嵌入
Applet
www服务器 www服务器
www浏览器请求
HTML
文件下载
HTML
文件 请求Applet
字节码下载 Applet字节码解释执行 Applet字节码
Designed by Chiyong,?200510
从 Web 上下载的 java Applet 是在称为 沙箱
(sandbox) 的安全环境中运行的。
大多数浏览器上,在沙箱中运行时:
Applet 绝不能运行任何一个本地可执行程序 。
Applet 除了可以与从中下载它们的服务器进行通信外,
不能与任何主机通信。
Applet 不能读写本地计算机的文件系统。
Applet 不能查找除版本号等以外的任何关于本地计算机的信息。
因此,由于 applet下载速度和功能的限制,它一般只用于 Intranet中
Applet 的安全性 Applet是设计用于从远程站点加载,然后在本地执行,因此,安全对于 Applet是至关重要的问题 。
Designed by Chiyong,?200511
Java applet 的程序结构
import java.applet.* ;
import java.awt.*;
public class OurApplet extends applet
{
String disp_str;
public void init()
{
disp_str = "Hello,World!";
}
public void paint( Graphics g )
{
g.drawString( disp_str,50,25 );
}
}
覆盖了 Applet类的 init( )
方法。该方法主要用于初始化 Applet中的变量。
覆盖了 Applet
类的 paint( )方法。用于在屏幕上给定的位置绘制字符串
Designed by Chiyong,?200512
java.awt包中类的关系组件在 java.applet包中
Button
Canvas
Checkbox
Label
Scrollbar
List
TextField
TextArea
Container
Window Panel
Frame AppletDialog
Event Font Component Graphics MenuComponent
java.awt包中类的关系组件类容器
Designed by Chiyong,?200513
Applet对象的坐标系
X轴
Y轴
Designed by Chiyong,?200514
将 applet 嵌入到 HTML
applet源文件首先用 Java 编译器编译:
javac OurApplet.java
为使一个 applet 能在浏览器中显示,我们必须使用 HTML
脚本描述,
将 applet嵌入到 HTML 页中的代码如下,
< applet CODE =,OurApplet,class” WIDTH = 200
HEIGHT = 300 >
< / applet >
可以将上面的代码保存为,Myapplet.html”
Designed by Chiyong,?200515
使用 appletviewer 查看 applet
applet 一经创建便能够使用任何支持它的,浏览器,软件或使用 appletviewer来查看。
通过浏览器查看 applet,
使用浏览器打开含有 applet 的 HTML文件就可以了 。
通过 appletviewer查看 applet,
可以这样打开 HTML文件来查看 applet,
C,\ JavaProgs > appletviewer MyApplet,Html
Designed by Chiyong,?200516
Applet 和应用程序之间的区别
Applet 应用程序
Applet基本上是为部署在 Web上而设计的应用程序是为作为独立程序工作而设计的
Applet是通过扩展
java.applet.Applet 类创建的应用程序则不受这种限制
Applet 通过 appletviewer或在支持
Java的浏览器上运行应用程序使用 Java解释器运行
Applet 的执行从 init() 方法开始 应用程序的执行从 main() 方法开始
Applet必须至少包含一个 public 类,
否则编译器就会报告一个错误。在该类中不一定要声明 main( )方法。
对于应用程序,public 类中必须包括 main( ),否则无法运行。
Designed by Chiyong,?200517
applet 的生命周期
applet
Working
applet
Born
applet
Displayed
Idle
State
applet
Destroyed
Initialization
state
If start( )
called again
start( )
paint( )
stop( )
destroy( )
Redraw applet
Destroy
applet
init( )
Start state
Designed by Chiyong,?200518
applet 生命周期中的不同状态无论什么时候创建 applet,都要调用 init( ) 方法;
在此方法中将 初始化变量 (创建对象,装载图像等);
这种方法在 applet 的生命周期内只能 调用一次 ;
方法?init( )? 的默认实现不做任何操作。因此此方法 必须 在
,applet”派生的类中 重写,以执行所需的初始化 代码,
初始状态( Initialization State),
Designed by Chiyong,?200519
启动状态( Start State),
调用 init( ) 方法之后,将自动调用 start( ) 方法,以从停止状态启动 applet;
因此只要 启动 applet,都将调用启动方法来启动
applet ;
因此 Start()方法可以被调用多次。
重新载入 applet 的 HTML 文档,而 applet 仍然在运行时,也将调用方法 ;( 重复打开网站的一个网页)
如果一个 applet 保持为,idle state( 闲置状态 ),
(当用户从 applet所在的 web页面转到其他页面,然后又返回),applet 将在用户恢复工作时调用 start( );
applet 生命周期中的不同状态
Designed by Chiyong,?200520
applet 生命周期中的不同状态只要必须重新绘制 applet 的输出,都要调用方法 paint( )。
例如:
一个 applet 窗口被一个新的窗口覆盖,就要调用
paint( ) 方法。
运行 applet 的窗口最小化之后再恢复的时候 。
绘制状态( Paint State),
Designed by Chiyong,?200521
applet 生命周期中的不同状态当用户从 applet 运行的页移动到其他页,stop( )方法就会停止第一页中的 applet。
该 applet 转为闲置状态 ( Idle state) 。
处于停止状态的 applet可以通过调用 start( )方法重新启动。
停止状态( Stop State),
Designed by Chiyong,?200522
当 对一个 applet调用 destroy( ) 方法时,该 applet就从内存中被完全销毁。
在下面的情况将调用 destroy 方法:
applet 运行的浏览器被关闭。
在当前运行的浏览器上打开一个新的站点。
这个方法将删除运行 applet的所有资源。
销毁状态( Destroy State),
applet 生命周期中的不同状态
Designed by Chiyong,?200523
applet 生命周期中的不同状态( 补充 )
repaint()方法:
调用 Repaint()方法时,程序首先清除 paint()
方法以前所画的内容,然后再调用 paint()方法调用顺序为,repaint() update() paint()
示例,repaint()
Designed by Chiyong,?200524
向 Applet传递参数
<APPLET CODE=“Our_Applet” WIDTH=200
HEIGHT=300>
<param name=“display_string” value=“Good
Morning!!”>
</APPLET>
Designed by Chiyong,?200525
向 Applet传递参数示例
import java.awt.*;
import java.applet.*;
public class FontPassDemo extends Applet {
String quote;
Font f;
public void init() {
quote=" Happiness is an attitude.";
String fontname=getParameter("font");
int fontsize=Integer.parseInt(getParameter("size"));
f=new Font(fontname,Font.ITALIC,fontsize);
}
public void paint(Graphics g) {
g.setFont(f);
g.drawString(quote,20,100);
}
}
<html>
<applet code = FontPassDemo width = 400 height = 200>
<param name=font value="Helvetica" >
<param name=size value="28" >
</applet>
</html>
更改参数值将改变字符串显示字体
Designed by Chiyong,?200526
Java中的图形
Java提供了 AWT 包,让你可以创建图形。
AWT 中的 Graphic 类包含丰富的方法,
这些方法被用来画下面的图形,
Oval 椭圆形
Rectangle 矩形
Square 正方形
Circle 圆形
Lines 线
使用不同字体的文本
Designed by Chiyong,?200527
Graphics对象
绘制图形的方法包含一个 Graphics类型的参数。
Graphics对象记录针对绘制图形和文本的一系列设置,比如设置的图标或当前颜色、
字体等。
Java中,所有绘制都必须通过一个图形对象。
Designed by Chiyong,?200528
基本的绘图方法
public void paint(Graphics g) {
g.setColor(someColor); //设置颜色
g.setFont(someLimitedFont); //设置字体
g.drawString(...);//绘制字符串
g.drawLine(...); //画线
g.drawRect(...); // 绘制图形轮廓
g.fillRect(...); // 绘制填充图形
g.drawPolygon(...);//绘制图形轮廓
g.fillPolygon(...);//绘制图形轮廓
..,
}
每个 AWT 组件定义一种传递 Graphics 对象的 paint
方法,绘制便是在该对象上执行。
设置画笔参数
Designed by Chiyong,?200529
Java 中的 Graphics 类的方法画 Strings,characters 和 bytes,
drawString(String str,int xCoor,int yCoor);
drawChars(char array[],int offset,int legnth,int xCoor,int
yCoor);
drawBytes(byte array[],int offset,int legnth,int xCoor,int
yCoor);
画线,
drawLine(int x1,int y1,int x2,int y2);
画和填充 Oval,
drawOval(int xCoor,int yCoor,int width,int height);
fillOval(int xCoor,int yCoor,int width,int height);
Designed by Chiyong,?200530
画和填充 Rectangles \ Rounded Rectangles(圆角矩形 ),
drawRect(int xCoor,int yCoor,int width,int height);
fillRect(int xCoor,int yCoor,int width,int height);
drawRoundRect(int xCoor,int yCoor,int width,int height,
int arcwidth,int archeight);
画和填充 3D Rectangles and Arcs(弧 ),
draw3DRect(int xCoord,int yCoord,int width,int height,
boolean raised)
drawArc(int xCoord,int yCoord,int width,int height,int
arcwidth,int archeight);
fillArc(int xCoord,int yCoord,int width,int height,int
arcwidth,int archeight);
Java 中的 Graphics 类的方法
Designed by Chiyong,?200531
画多边形,
drawPolyline(int xArray[],int yArray[],int totalPoints)
Java中的颜色控制,
Color c = new Color(255,175,175);
将创建颜色粉红,Pink”
设置颜色,使用下面语句,
g.setColor(c) ;
Java 中的 Graphics 类的方法
Designed by Chiyong,?200532
Java中的字体控制,
Font (,I love India,,Font.BOLD,14 );
Font Size
BOLD
ITALIC
PLAIN
文本
Java 中的 Graphics 类的方法
Designed by Chiyong,?200533
Graphics对象的局限性
可以用 Graphics对象绘制的图形是原始图形。
对于这些图形,不能使用实数坐标
不能绘制虚线或宽度不定的线条
不能使用纹理或渐变颜色填充形体
Designed by Chiyong,?200534
Graphics2D对象
Java2D 包括一个 Graphics2D 类,此类扩展了 Graphics 类,所有图形方法都可以配合 Graphics2D 对象使用
Java 2D 图形的重要功能:
颜色和图案:图形可以用渐变颜色和填充图案着色。
透明绘制:图形的不透明度通过 α 透明值控制。
本地字体:平台上的所有本地字体都可用于绘制文本。
画笔的显式控制:可以使用线条的粗细、虚线图案以及段连接样式。
坐标系的转换:可以使用平移、缩放、旋转和剪切为了解决图形对象的局限性,在 Java1.1以后的版本中引入了 Java 2D。
Designed by Chiyong,?200535
Java 2D 中的基本绘图方法
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D)g;//强制转换为 Graphics2D
g2d.setPaint(fillColorOrPattern);
g2d.setStroke(penThicknessOrPattern);
g2d.setComposite(someAlphaComposite);
g2d.setFont(anyFont);
g2d.setColor(anyColor);
g2d.translate(...);
g2d.rotate(...);
g2d.scale(...);
g2d.shear(...);
g2d.setTransform(someAffineTransform);
g2d.draw(s); // 绘制图形轮廓
g2d.fill(s); // 绘制填充图形
}
设置画笔参数参见示例 >>
Designed by Chiyong,?200536
Swing组件的类包位置结构
Java.lang.Object
Java.awt.Compone
nt
Java.awt.Container
Java.swing.Jcomponent
javax.swing.Jpanel