|
|
摘 要 本文通过程序实例,介绍在JAVA 中绘制图形用户界面方法和事件处理机制,给出了实现图形
用户界面的具体方法。
关键词 控制组件 接口 图形用户界面 事件驱动
中图分类号:TP312 文献标识码:A 文章编号:1671 - 3524(2003) 03 - 0051 - 04
收稿日期:2003 - 05 - 12
作者简介:欧建圣,男,1956 年生,武汉工程职业技术学院信息工程系工程师。。
面向对象程序设计技术其设计过程可以概括为两个步骤:第一步设计图形用户界面CUI (Graphics Uaer
Interface) 及其控件(Control) ;第二步编制相应的事件过程(代码) 。在运行时,程序接收用户对图形界面的操
作行为,并根据不同的操作行为执行相应的事件过程,从而实现程序与用户的交互功能。这即是事件驱动
机制。Java 语言也具有事件驱动机制,但是在具体实现方法上有自己的特殊性。这些特殊性给初学者带来
一定的障碍。本文将对JAVA 语言的图形用户界面及事件处理机制进行讨论,力求能给JAVA 语言的初学者
排扰解难。
1 图形用户界面的绘制
图形用户界面极大方便了用户操作,它是面向对象程序设计技术的重要组成部分。在Java 中,绘制图
形用户界面与事件驱动是分开处理的。绘制图形用户界面是用java. awt 包,而事件处理是由java. awt . eveat
包实现。下面先讨论java. awt 包。
1. 1 java. awt 包
JAVA 语言中用于生成各种标准图形界面的类库是java. awt 包和处理图形界面各种事件的类库是;ava.
awt . event 包。AWT(Abstract Windows Toolkit) 即抽象窗口工具,用它开发出的图形用户界面可以适用于所有
的平台系统,与特定的硬软件无关。在涉及图形用户界面的程序中要引入import java. awt .
3
; import java.
awt . event 包。JAVA 语言中图形用户界面的各种成分和元素有两类:一类是标准控制组件,它是组成图形用
户界面的最小单位;另一类是用户自己定义的部分,它是用户绘制的几何图形、线条、图象等,仅仅起装饰美
化作用,不具备有交互功能。所有标准控制组件都是java. awt. 3 包中的component 类的子类。容器是能够容
纳并摆放其他标准控制组件的组件,使用容器有利于简化图形用户界面。
AWT 的标准控制组件层次结构图如下:
使用标准控制组件的步骤为:创建一个标准控制组件;将该标准控制组件加到某个容器中;对其进行事
件编程。
1. 2 Component 类的常用方法
它提供了对图形颜色、字体大小等控制和图形环境设置。
public void setEnable (boolean b) ;设置控制组件使能状态。只有使能状态的控制组件才能接受用户输入
并引发事件。
public Color getBackgrouud() ; 获得控制组件的背景颜色。
第15 卷第3 期
2003 年9 月
武汉工程职业技术学院学报
Journal of Wuhan Engineering Institute
Vol . 15. No. 3
September. 2003
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
图1 AWT标准控制组件层次结构[1 ] 图2 AWT Event 类层次结构[2 ]
public Font setFont () ; 设置控制组件使用的字体。
public Graphics getGraphics() ; 获得在控制组件上绘图时需要使用的Graphics 对象。
public void repaint (Graphics g) ; 重绘图形。
public void setBackground(Color c) ; 设置控制组件的背景颜色。
1. 3 用户自己定义的图形界面
用户可以根据系统提供的图形类绘制一些几何图形、使用标志图案。在JAVA 语言中一般用java. awt 包
中的Graphics 类实现用户定义的图形界面。特别要提到的是JAVA Applet 本身就是容器,系统在执行JAVA
Applet 程序时自动为这个JAVA Applet 创建一个Graphics 对象实例,利用这个实例提供的方法绘制图形、图
象。Graphics 对象实例既可以由系统自动产生,也可以通过getGraphics () 方法获得。
事实上在JAVA Applet 程序中可以由系统自动绘制图形界面,既通过paint () 方法:
public void paint (Graphics g)
{
/ / 绘图方法;
⋯
}
也可以通过Graphics 对象实例,在Paint () 方法之外绘制图形界面,例如:
public void userdraw()
{
Graphics g = getGraphics() ;
g. drawString(“JAVA GOOD !”,x ,y) ;
⋯
}
Graphics 类的常用方法
public abstract void drawArc (int x ,int y , int width , int height , int startAngle , int arcAngle) ;画弧
public abstract boolean drawImage ( Image img ,inx x , int y , ImageObesrver observer) ;显示图象
public abstract void drawLine (int x1 , int y1 , int x2 , int y2) ; 画线
public void drawRect (int x , int y , int width , int height) ;画矩形
public abstract void drawString(String str , int x ,int y) ; 写文字
public abstract void setColor (Color c) ;设置颜色
public abstract void setFont (Font font) ; 设置字体
1. 4 在JAVA Applet 程序中图形用户界面绘制时机
(1) 当外形发生变化时(例如窗口的大小位置等显示区域更新时) ,AWT 会自动调用各控制组件的paint
() 方法,paint () 方法将保留上次的屏幕输出;
(2) 程序中直接调用repaint () 方法,重新绘制图形;
(3) AWT 响应外部的事件时,AWT会自动调用repaint () 方法,重新绘制图形。
2 5 武汉工程职业技术学院学报 2003. 15 (3)
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
下面讨论事件处理机制。
2 JAVA 的事件处理机制
图形界面绘制后,在屏幕上是静止的,无法接收用户对其进行的操作行为,必须对其进行事件编程,图
形用户界面才具备有程序交互能力。
2. 1 事件源和监听者
在JAVA 中每个能够产生事件的控制组件称为事件源,例如按钮Button、菜单menuItem 等,而接受并处理
事件的部分称为监听者。用户与程序之间的交互通常表现为键盘或鼠标器等行为,这些行为产生相应的事
件,然后由系统自动调用相应的事件过程,从而完成用户特定的功能。这就是所谓图形用户界面中事件和
事件响应机制。在JAVA 语言中绘制图形用户界面是用java. awt .
3
包中的component 类和Graphics 类,而在
JAVA 控制组件不处理事件,事件处理交由java. awt . event 包中的相应类和接口完成。这样使得程序中的事
件处理代码与图形用户界面构成代码得以分离,一方面有利于优化程序的结构,另一方面由于JAVA 对事件
作了详细的分类并委托到不同的接口方法加以处理,使得代码性能得到提高。
JAVA 中AWT Event 类的层次结构如下:
2. 2 委托事件模型
当某个AWT 组件产生事件后,生成一个特定的事件类对象实例,交由事件监听者加以处理,这样就构成
了JAVA 中所谓的“委托事件模型”,不同的事件由不同的监听者处理,甚至还有的一个组件可以产生多个不
同的事件,也就是说,同一个组件可能委托多个监听者。
将一个组件委托到特定的监听者,要做的事情为:
①创建一个控制组件并将该控制组件加到某个容器中,xxx = new 组件类名;add (xxx) ;
②注册监听者,xxx. add YYYYListener (监听者对象) ;
③实现接口并覆盖接口中的全部方法(implements YYYYListener) 。
其中xxxx 为用户定义的组件名称,YYYY为事件名。
2. 3 JAVA 的事件处理编程要点
①引入java. awt . event 包,即事件类: ②实现接口,甚至可以实现多个接口; ③覆盖接口中的全部方法,
将其中不响应的方法屏蔽,即将方法置空; ④不同的组件可以产生相同的事件即注册到同一个监听者上,从
而执行了同一个事件方法,为了分辨是哪一个组件产生了该事件,JAVA 提供了获取事件源的方法,getSource
() 和getActionCommand() ,获取事件产生时鼠标器的位置getx ( ) ,gety ( ) 。⑤取消事件注册,remove YYYYLis2
tener () 。
3 程序实例
作为本文的总结,给出一个带有详细注释的程
序,使读者可以从中学到在JAVA 中实现图形用户
界面的具体方法。
zhsy. java
import java. applet .
3
;
import java. awt .
3
;
import java. util .Date ;
import java. awt . event .
3
;
public class zhsy extends Applet implements ActionListen2
er , TextListener/ / 用户定义类zhsy 继承
{ Date rq ;
TextField textl ,text2 ,text3 ;
Button button1 ,button2 ,button3 ;
Panel p1 ,p2 ,p3 ;
Labe1 11 ,12 ,13 ;
public void init ()
{
p1 = new Pane1() ;/ / 生成面板类Panel 对象实例P1 ;
p1. setBackground (Color. gray) ;/ / 为P1 设置背景效
果;
P2 = new Panel () ;
p2. setBackground(Color. red) ;
3 5 欧建圣:JAVA2 程序设计语言重点难点剖析及对策(二)
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
p3 = new Panel () ;
p3. setBackground(Color. cyan) ;
11 = new Label (“标签”1 in p1”) ;/ / 生成标签类Label
对象实例L1 ;
12 = new Label (“标签”2 in p2”) ;
13 = new Label (“标签”3 in p3”) ;
p1. add(11) ;/ / 将L1 加入到容器P1 中;
p2. add(12) ;
p3. add(13) ;
button3 = new Button(“按扭3”) ;/ / 生成按钮类Button
对象实例Button3 ;
p3. add(button3) ;/ / 将button3 加入到容器p3 中;
button3. addActionListener ( this) ;/ / 将button3 产生的
事件处理委托给接口ActionListener ;
p1. add(p3) ;/ / 将p3 加入到p1 中;
this. add(p1) ;/ / 将p1 加入到Applet 中;
add (p2) ;/ / 将p2 加入到Applet 中;
text1 = new TextField (“文本框1 ”) ;/ /
生成文本类TextField 对象实例text1
add (text1) ;/ / 将Text1 加入到Applet 中;
text1. addActionListener (this) ;/ / 将Text1 产生的事件
处理委托给接口ActionListener ;
text1. addTextListener (this) ;/ / 将Text1 产生的事件处
理委托给接口TextListener ;
text2 = new TextField(“文本框2 ”) ;
add (text2) ;
text2. addActionListener (this) ;
text2. addTextListener (this) ;
text3. add TextField(“文本框3 ”) ;
add (text3) ;
button1 = new Button(“按钮1”) ;
add (button1) ;
button1. addActionListener (this) ;
button2 = new Button(“按钮2”) ;
add (button2) ;
button2. addActionListener (this) ;
}
public void actionPerformed(ActionEvent e) / / 重载接口
ActionListener 中全部方法,重写actionPer
{ / / formed() 方法;
if (e. getSource () = = text1) / / 产生单击事件之后,如
果事件源是Text1 则在Text3 中显示
{text3. setText (“text1 is action !”) ;}/ / 文本“text1
is action !”;
if (e. getSource () = = text2)
{text1. enable (false) ;/ / 产生事件,接收输入,并
在Text2 中显示“text1 is close”;
text2. setTEXT(“text1 is close”) ;
}
if (e. getSource () = = button2) / / 产生单击事件之后,
如果事件源是button2 则与button1 功能相反;
{text1. enable (ture) ;
text2. setText (“text1 is action”) ;
}
if (e. getSource () = = button3) / / 产生单击事件之后,
如果事件源是button3 则将Text1 ,Text2 ,Text3
{text1. setText (“”) ;
text2. setText (“”) ;
text3. setText (“”) ;
}
}
public void textValueChanged (TextEvent e) / / 重载
接口textListener 中全部方法,即重写
{ / / textValueChanged ( ) 方法, (文本改变
事件)
if (e. getSource ( ) = = text1) / / 如果在text1
中输入新的文本则在text3 中显示
{ text3. setTEXT (“text1 is action !”) ;}/ /
“text1 is action !”;
if (e. getSource () = = text2)
{text3. setTEXT(“text2 is action !”) ;}
repaint () ;/ / 重绘Applet 图形界面;
}
public void paint (Graphics g) / / 重载Applet 类中
的Paint () 方法,显示当前时间画一个
{rq = new Date () ;/ / 3D 矩形
showStatus (rq. to String() ) ;
g. drawString(“lock here ! ! !”,430 ,400) ;
g. draw3DRect (530 ,300 ,200 ,100 ,true) ;
}
}
(下转第67 页)
4 5 武汉工程职业技术学院学报 2003. 15 (3)
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
(6) 研究生扩招是延缓就业高峰的有效方法。根据国家教委的计划,明年我国研究生招生人数将达到
27 万,作为教育发达的武汉市,招生人数估计在1 万5 千上下,而武汉市每年新增劳动力才6 万。也就是说,
近25 %的新增劳动力可以通过研究生扩招推迟三年就业。如果招生人数能达到2 万,则有近35 %的新增劳
动力可推迟三年就业,这将极大地缓解武汉市目前的就业压力。不仅如此,研究生扩招还能加强劳动力的
人力资源能力建设,减少结构性失业。
(7) 建立完善的社会保障体系,缓减就业压力。在社会保障制度建设方而,武汉市政府可以采取以下具
体办法:一是把落实城市最低生活保障制度摆到突出的会置,各级财政在预算中要优先安排所需保障资金,
进一步扩大失业人员最低生活保障范围。二是建立离退休人员医疗保险、养老保险等保险制度。对国有企
业的富余人员,下岗或失业人员,政府应该鼓励他们不就业,而通过健全的社会保障体系来保障他们的精神
和物质生活。
(8) 控制人口增长,从源头减少新增劳动力。通过劳动力存量和增量结构分析,尽管新增劳动力不是武
汉市就业压力主要来源,但是,只有新增劳动力是可以减少(劳动力存量只能通过转移) ,也许有人认为,目
前武汉市控制人口增长的空间不大,且有可能引起人口老龄化等一系列问题。笔者认为,由于就业问题是
一个长期问题,从长远看,武汉市的人口增长率仍有下降的可能,至少可能使人口自然增长率下降到零。这
样是不是若干年后武汉市会出现人口老龄化,而清壮劳动力不足呢? 恰恰相反,由于武汉市人口基数大,青
壮年劳动力的绝对数仍很大,完全可保证经济发展对劳动力的需求;而且,数年后的老龄人口增加正好可以
促进社会保障制度完善。
(9) 大力发第展三产业,特别是服务业,提高其对就业的弹性系数。根据有关数据统计:第三产业在GDP
中每增加一个百分点,就能增加1000 万个就业岗位。与发达国家或我国其他发达地区相比,武汉市第三产
业占GDP 的比重远低于发达国家的70~80 %水平,假使武汉市第三产业在GDP 的比重能达到50 %左右,将
可以增加近30 万个就业机会。而在第三产业中服务业吸纳就业能力强。武汉市政府应着力提高服务业在
GDP 中的比重,在经济增长速度一定的条件下,将极大地缓解武汉市的就业压力。武汉市的社会服务业发
展潜力巨大,从目前情况看,作为华中腹地的武汉市,单第三产业中的商业、保险、金融、会计、咨询等服务业
在未来5~10 年内对劳动力的潜在需求将达到60~100 万。
|
|