(3)mouseEntered(MouseEvent),负责处理鼠标进入容器事件。 (4)mouseExited(MouseEvent),负责处理鼠标离开容器事件。 (5)mouseClicked(MouseEvent),负责处理鼠标点击事件。 任何组件上都可以发生鼠标事件:鼠标进入、鼠标退出、按下鼠标等。
如果程序希望进一步知道按下或点击的是鼠标左键还是右键,鼠标的左键和右键可用InputEvent类中的常量BUTTON1_MASK和BUTTON3_MASK来判定。 例如,以下表达式判断是否按下或点击了鼠标右键:e.getModifiers()= =InputEvent.BUTTON3_MASK
6.6.2 MouseMotionListener接口MouseMotionListener接口能处理拖动鼠标和鼠标移动两种事件。注册监视器的方法是:
addMouseMotionListener(监视器)要实现的接口方法有两个: (1)mouseDragged(MouseEvent),负责处理鼠标拖动事件。 (2)mouseMoved(MouseEvent),负责处理鼠标移动事件。 鼠标指针形状也能由程序控制,setCursor()方法能设置鼠标指针形状。 6.7 键盘事件
键盘事件的事件源一般与组件相关,当一个组件处于激活状态时,按下、释放或敲击键盘上某个键时就会发生键盘事件。键盘事件的接口是keyListener,注册键盘事件监视器的方法是addKeyListener(监视器)。实现KeyListener接口的方法有3个:
(1)keyPressed(KeyEvente),键盘上某个键被按下。
(2)keyReleased(KeyEvente),键盘上某个键被按下后,又释放。 (3)keyTyped(KeyEvente),keyPressed和keyReleased两方法的组合。
管理键盘事件的类是KeyEvent,该类提供方法:
publicintgetKeyCode(),获得按动的键码,键码表在KeyEvent类中定义。 7.1 绘图基础
要在平面上显示文字和绘图,首先在确定一个平面坐标系。Java语言约定,显示屏上一个长方形区域为程序绘图区域,坐标原点(0,0)位于整个区域的左上角。一个坐标点(x,y)对应屏幕窗口中的一个像素,必须是整数。 7.1.1 Graphics类的基本功能
在java.awt包中,类Graphics提供的功能有:建立字体、设定显示颜色、显示图像和文本,绘制和填充各种几何图形。可以从图形对象或使用Component的get?Graphics()方法得到 Graphics对象。Graphics2D类继 承Graphics类,并且增加了许多状态属性,使应用程序可以绘制出更加丰富多彩的图形。在某个组件中绘图,一般应该为这个组件所属的子类重写paint()方法,在该重写的方法中进行绘图。但要在JComponent子类的组件中绘图,应重写paintComponent()方法,在该方法中进行绘图。系统自动为程序提供图形对象,并以参数g传递给paint()方法和paintComponent()方法。 7.1.2 字型和颜色 显示文字的方法主要有三种:
(1)drawString(Stringstr,intx,inty)
(2)drawChars(chardata[],intoffset,intlength,intx,inty)
(3)drawBytes(bytedata[],intoffset,intlength,intx,inty)
文字字型有三个要素:字体、风格和字号。常用的字体有TimesNewRoman、Symbol、宋体、楷体等。常用的风格有三种:正常、粗体和斜体,分别用三个常量表示:Font.PLAIN(正常)、Font.BOLD(粗体)和Font.ITALIC(斜体)。风格可以组合使用。在Java语言中,用类Font对象设置字型。Font类 的构造方法有:
Font(StringfontName,intstyle,intsize),3个参数分别表示字体、风格和字号。
使用 Graphics的方法 setFont(Fontfont)设置字型。
用类Color的对象设置颜色,有两种方法生成各种颜色。一是用类Color预定义的颜色:black、red、white、yellow……,二是通过红绿蓝(RGB)的值合成颜色。
7.1.3 绘图模式
设背景色为B,用setXORMode()设置的颜色为C,
另用某个非背景色D绘图,XOR模式有以下确定实际绘图颜色的法则: B+B=C,用背景色绘图,出现C颜色。
D+D=B,当一个图形重画时就能清除原先所画的图形。 7.2 绘图
Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力。 7.2.1 Graphics类的绘图方法
Graphics类提供基本的几何图形绘制方法,主要有:画线段、画矩形、画圆、画带颜色的图形、画椭圆、画圆弧、画多边形等。 (1)画线段
在窗口中画一条线段,可以使用 Graphics类的 drawLine()方法:
drawLine(intx1,inty1,intx2,inty2) g.drawLine(100,100,100,100);//画一个点 (2)画矩形
有两种矩形:普通型和圆角型。 画普通矩形有两个方法:
drawRect(intx,inty,intwidth,intheight),画线框围起来的矩形。
fillRect(intx,inty,intwidth,intheight),是用预定的颜色填充一个矩形,得到一个着色的矩形块。 画圆角矩形也有两个方法:
drawRoundRect(intx,inty,intwidth,intheight,
intarcWidth,intarcHeight)。
fillRoundRect(intx,inty,intwidth,intheight,int
areWidth,intarcHeight)
可以用画圆角矩形方法画圆形,当矩形的宽相等,圆角弧的横向直径和圆角弧的纵向直径也相等,并等于矩形的宽和高时,画的就是圆形。 (3)画三维矩形
画三维矩形有两个方法:
draw3DRect(intx,inty,intwidth,intheight,bool?
eanraised)
fill3DRect(intx,inty,intwidth,intheight,boolean raised) (4)画椭圆形
椭圆形由椭圆的横轴和纵轴确定。画椭圆形有两个方法:
drawOval(intx,inty,intwidth,intheight)
fillOval(intx,inty,intwidth,intheight),是用预定的颜色填充的椭圆形,是一个着色块。也可以用画椭圆形方法画圆形,当横轴和纵轴相等 时,所画的椭圆形即为圆形。 (5)画圆弧画圆弧有两个方法:
drawArc(intx,inty,intwidth,intheight,intstar?
tAngle,intarcAngle),画椭圆一部分的圆弧线。
fillArc(intx,inty,intwidth,intheight,intstar?
tAngle,intarcAngle),用setColor()方法设定颜色,画着 色椭圆的一部分。 (6)画多边形
drawPolygon(intxPoints[],intyPoints[],int nPoints)
fillPolygon(intxPoints[],intyPoints[],int nPoints)
也可以用多边形对象画多边形。用多边形类Polygon创建一个多边形对象,然后用这个对象绘制多边形。 (7)擦除矩形块
clearRect(intx,inty,intwidth,intheight) (8)限定作图显示区域
方法是clipRect(intx,inty,intwidth,intheight) (9)复制图形
copyArea(intx,inty,intwidth,intheight,intdx,intdy)
一般的绘图程序要继承JFrame,定义一上JFrame窗口子类,还要继承JPanel,定义一个JPanel子类。在JPanel子类中重定义方法paintComponent(),在这个方法中调用绘图方法,绘制各种图形。 7.2.2 Graphics2D类的绘图方法
Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展 Graphics类提供一个 Graphics2D类,它拥有更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。 1.绘图属性
(1)stroke属性
stroke属性控制线样的宽度、笔形样式、线段连接方式或知道划线图案。 (2)paint属性
paint属性控制填充效果 (3)transform属性
transform属性用来实现常用的图形平移、缩放、旋转和斜切等变换操作。 (4)clip属性
clip属性用于实现剪裁效果。
(5)composit属性
composit属性设置图形重叠区域的效果。 2.Graphics2D类的绘图方法
在java.awt.geom包中声明的一系列类,分别用于创建各种几何图形对象。 3.Graphics2D的几何图形类 (1)线段(Line2D)
(2)矩形(Rectangle2D)
(3)圆角矩形(RoundRectangle2D) (4)椭圆(Ellipse2D) (5)圆弧(Arc2D)
(6)二次曲线(QuadCurve2D)
方法Double()中的6个参数分别是二次曲线的始点、控制点和终点。 (7)三次曲线(CubicCurve2D)
方法double()中的8个参数分别是三次曲线的始点、两个控制点和终点。 7.3 图像处理基础
图像是由一组像素构成,用二进制形式保存的图片,Java语言支持GIF、JPEG和BMP这3种主要图像文件格式。Java语言的图像处理功能被封装在Image类中。 7.3.1 图像载入和输出
在Java程序中,图像也是对象,所以载入图像时,先要声明Image对象,然后,利用getImage()方法把Image对象与图像文件联系起来。
(1)ImagegetImage(URLurl),url指明图像所在位置和文件名。 (2)ImagegetImage(URLurl,Stringname),url指 明图像所在位置,name是文件名。取相对位置的方法有:
(1)URLgetCodeBase(),取小应用程序文件所在的位置。
(2)URLgetDocumentBase(),取 HTML文件所在的位置。 获取图像信息(属性)的方法有:
(1)getWidth(ImageObserverobserver),取宽度。 (2)getHeight(ImageObserverobserver),取高度。 7.3.2 图像缓冲技术
当图像信息量较大,采用以上直接显示的方法,使显示呈斑驳现象。为了提高显示效果,许多应用程序都采用图像缓冲技术,即先把图像完整装入内存,在缓冲区中绘制图像或图形,然后将缓冲区中绘制好的图像或图形一次性输出在屏幕上。 7.4 多媒体基础
7.4.1 播放幻灯片和动画
小应用程序先将幻灯片读入数组中存储,单击鼠标变换幻灯片,逐张显示。
小应用程序播放动画的方法。播放的图片和小程序放在相同的目录中。程序通过快速显示一组图片造成显示动画的效果。 7.4.2 播放声音
Java语言支持的音频格式有多种等。小程序要播放音频文件,可使用类 AudioClip,该类在java.applet.AudioClip类库中定义。小程序先创建AudioClip对象,并用getAudioClip()方法为其初始化。代码形式如下: audioClipaudioClip=getAudioClip(getCodease(),myAudioClipFile.au?); 如果要从网上获得音频文件,可用方法getAudio?
Clip(URLurl,Stringname),根据url地址及音频文件 name获得可播放的音频对象。
控制声音的播放有3个方法:play()播放声音,loop
()循环播放和stop()停止播放。
如果声音文件较大或网络速度慢会影响小程序的初始化工作。这可用多线程技术解决。在一个级别较低的线程中完成音频对象的创建,即由后台载入声音文件,前台播放。 8.1 线程的基本概念
进程是程序的一次执行过程,从代码加载、执行,直至完成的一个完整过程。这个过程也是进程从产生、运行至消亡的过程。程序与进程之间的关系如同乐谱与一次演奏的关系。乐谱好比程序,演奏好比进程,演奏的依据是乐谱,进程执行的依据是程序。线程是一个控制流,也是一个执行过程,但执行单位比进程小。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。每条线索,即每个线程也有它自身的产生、运行和消亡的过程。线程与进程比较,它们的共同点,都是程序的一个执行过程。不同点是进程是一个实体,每个进程有自己的状态、专用数据线(独立内存资源);同一个进程下的线程则共享进程的数据段。创建进程时,必须建立其专用的数据段;创建线程时不必建立新的数据段。线程不是能够独立运行的 程序,而只是某个进程内的一个执行流。线程的建立和线程间的切换速度大大超过进程,不 需要数据段的保护和恢复。同时,又具备进程的大多数优点,所以线程的执行效率比进程的执行效率高。缺点是由于多个线程共享数据段,带来数据访问过程中的互斥和同步问题,使系统管理变得复杂。多线程在提高输入/输出设备平行工作能力、有效利用系统资源、改善计算机通信及发挥硬件的多处理器功能等方面有很大的优势。 8.1.1 线程的生命周期
一个线程“创建→工作→死亡”的过程称为线程的生命周期。线程生命周期共有五个状态:新建状态、就绪状态、运行状态、阻塞状态和死亡状态。 8.1.2 线程调度与优先级
Java提供一个线程调度器来监视和控制就绪状态的线程。线程的调度策略采用抢占式,优先级高的线程比优先级低的线程优先执行。在优先级相同的情况下,就按“先到先服务”的原则。每个Java程序都有一个默认的主线程,就是通过JVM启动的第一个线程。对于应用程序,主线程执行的是main()方法。对于Applet,主线程是指浏览器加载并执行小应用程序的那一个线程。子线程是由应用程序创建的线程。另有一种线程称为守护线程(Daemon),这是一种用于监视其他线程工作的服务线程,它的优先级最低。 8.2 Thread类和Runnable接口
Java程序实现多线程应用有两种途径:一是继承Thread类声明Thread子类,用Thread子类创建线程对象。二是在类中实现Runnable接口,在类中提供Runnable接口的run()方法。无论用哪种方法,都需要Java基础类库中的Thread类及其方法的支持。程序员能控制的关键性工作有两个方面:一是编写线程的run()方法;二是建立线程实例。 8.2.1 Thread类
Thread类是用来创建线程和提供线程操作的类。 1.Thread类提供的方法
Thread类为创建线程和线程控制提供以下常用的 方法:
(1)Thread(),创建一个线程。
(2)Thread(Stringm),创建一个以m命名的线程。
(3)Thread(Runnabletarget),创建线程,参数target是创建线程序的目标。目标是一个对象,对象的类要实现Runnable接口,类中给出接口的run()方法。
(4)getPriority(),获得线程的优先级。
(5)setPriority(intp),设定线程的优先级为p。优先级的数值越大优先级越高(缺省是5)。常用以下3个优先级: Thread.MIN?PRIORITY(最低)、Thread.MAX?PRI?