友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
Java编程思想第4版[中文版](PDF格式)-第99部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
…………………………………………………………Page 410……………………………………………………………
剪贴板操作在Java 1。1 版中也得到支持,尽管拖放操作“将在新版本中被支持”。我们可能访问桌面色彩组
织,所以我们的Java 可以同其余桌面保持一致。可以利用弹出式菜单,并且为图像和图形作了改进。也同样
支持鼠标操作。还有简单的为打印的API 以及简单地支持滚动。
13。16。1 新的事件模型
在新的事件模型的组件可以开始一个事件。每种类型的事件被一个个别的类所描绘。当事件开始后,它受理
一个或更多事件指明“接收器”。因此,事件源和处理事件的地址可以被分离。
每个事件接收器都是执行特定的接收器类型接口的类对象。因此作为一个程序开发者,我们所要做的是创建
接收器对象并且在被激活事件的组件中进行注册。event…firing 组件调用一个 addXXXListener()方法来完成
注册,以描述XXX 事件类型接受。我们可以容易地了解到以 addListened 名的方法通知我们任何的事件类型
都可以被处理,如果我们试图接收事件我们会发现编译时我们的错误。Java Beans 同样使用这种
addListener 名的方法去判断那一个程序可以运行。
我们所有的事件逻辑将装入到一个接收器类中。当我们创建一个接收器类时唯一的一点限制是必须执行专用
的接口。我们可以创建一个全局接收器类,这种情况在内部类中有助于被很好地使用,不仅仅是因为它们提
供了一个理论上的接收器类组到它们服务的UI 或业务逻辑类中,但因为(正像我们将会在本章后面看到的)
事实是一个内部类维持一个句柄到它的父对象,提供了一个很好的通过类和子系统边界的调用方法。
一个简单的例子将使这一切变得清晰明确。同时思考本章前部 Button2。java 例子与这个例子的差异。
//: Button2New。java
// Capturing button presses
import java。awt。*;
import java。awt。event。*; // Must add this
import java。applet。*;
public class Button2New extends Applet {
Button
b1 = new Button(〃Button 1〃);
b2 = new Button(〃Button 2〃);
public void init() {
b1。addActionListener(new B1());
b2。addActionListener(new B2());
add(b1);
add(b2);
}
class B1 implements ActionListener {
public void actionPerformed(ActionEvent e) {
getAppletContext()。showStatus(〃Button 1〃);
}
}
class B2 implements ActionListener {
public void actionPerformed(ActionEvent e) {
getAppletContext()。showStatus(〃Button 2〃);
}
}
/* The old way:
public boolean action(Event evt; Object arg) {
if(evt。target。equals(b1))
getAppletContext()。showStatus(〃Button 1〃);
else if(evt。target。equals(b2))
getAppletContext()。showStatus(〃Button 2〃);
// Let the base class handle it:
else
409
…………………………………………………………Page 411……………………………………………………………
return super。action(evt; arg);
return true; // We've handled it here
}
*/
} ///:~
我们可比较两种方法,老的代码在左面作为注解。在 init()方法里,只有一个改变就是增加了下面的两行:
b1。addActionListener(new B1());
b2。addActionListener(new B2());
按钮按下时,addActionListener()通知按钮对象被激活。B1 和B2 类都是执行接口ActionListener 的内部
类。这个接口包括一个单一的方法 actionPerformed() (这意味着当事件激活时,这个动作将被执行)。注
意actionPreformed()方法不是一个普通事件,说得更恰当些是一个特殊类型的事件,ActionEvent。如果我
们想提取特殊ActionEvent 的信息,因此我们不需要故意去测试和下溯造型自变量。
对编程者来说一个最好的事便是actionPerformed()十分的简单易用。它是一个可以调用的方法。同老的
action()方法比较,老的方法我们必须指出发生了什么和适当的动作,同样,我们会担心调用基础类
action()的版本并且返回一个值去指明是否被处理。在新的事件模型中,我们知道所有事件测试推理自动进
行,因此我们不必指出发生了什么;我们刚刚表示发生了什么,它就自动地完成了。如果我们还没有提出用
新的方法覆盖老的方法,我们会很快提出。
13。16。2 事件和接收者类型
所有AWT 组件都被改变成包含addXXXListener()和removeXXXListener()方法,因此特定的接收器类型可从
每个组件中增加和删除。我们会注意到“XXX”在每个场合中同样表示自变量的方法,例如,
addFooListener(FooListener fl)。下面这张表格总结了通过提供addXXXListener()和 removeXXXListener()
方法,从而支持那些特定事件的相关事件、接收器、方法以及组件。
事件,接收器接口及添加和删除方法 支持这个事件的组件
Event; listener interface and C o m p o n e n t s s u p p o r t i n g t h i s e v e n t
add a n d r e m o v e m e t h o d s
A c t i o n E v e n t B u t t o n ; L i s t ; T e x t F i e l d ; M e n u I t e m ; and its derivatives
A c t i o n L i s t e n e r including C h e c k b o x M e n u I t e m ; M e n u ; and P o p u p M e n u
a d d A c t i o n L i s t e n e r ( )
r e m o v e A c t i o n L i s t e n e r ( )
A d j u s t m e n t E v e n t S c r o l l b a r
A d j u s t m e n t L i s t e n e r Anything you create that implements the Adjustable interface
a d d A d j u s t m e n t L i s t e n e r ( )
removeAdjustmentListener( )
C o m p o n e n t E v e n t C o m p o n e n t and its derivatives; including Button; Canvas;
C o m p o n e n t L i s t e n e r Checkbox ; Choice; Container ; Panel ; Applet ; ScrollPane;
a d d C o m p o n e n t L i s t e n e r ( ) Window ; Dialog ; FileDialog; Frame ; Label; List ; Scrollbar;
removeponentListener( ) T e x t A r e a ; and T e x t F i e l d
C o n t a i n e r E v e n t C o n t a i n e r and its derivatives; including Panel ; Applet ;
C o n t a i n e r L i s t e n e r S c r o l l P a n e ; W i n d o w ; D i a l o g ; F i l e D i a l o g ; and Frame
a d d C o n t a i n e r L i s t e n e r ( )
removeContainerListener( )
F o c u s E v e n t C o m p o n e n t and its derivatives; including Button; Canvas;
F o c u s L i s t e n e r Checkbox ; Choice; Container ; Panel ; Applet ; ScrollPane;
a d d F o c u s L i s t e n e r ( ) Window ; Dialog ; FileDialog; Frame Label; List ; Scrollbar;
r e m o v e F o c u s L i s t e n e r ( ) T e x t A r e a ; and T e x t F i e l d
K e y E v e n t C o m p o n e n t and its derivatives; including Button; Canvas;
410
…………………………………………………………Page 412……………………………………………………………
K e y L i s t e n e r Checkbox ; Choice; Container ; Panel ; Applet ; ScrollPane;
a d d K e y L i s t e n e r ( ) Window ; Dialog ; FileDialog; Frame ; Label; List ; Scrollbar;
r e m o v e K e y L i s t e n e r ( ) T e x t A r e a ; and T e x t F i e l d
M o u s e E v e n t (for both clicks and C o m p o n e n t and its derivatives; including Button; Canvas;
motion) Checkbox ; Choice; Container ; Panel ; Applet ; ScrollPane;
M o u s e L i s t e n e r Window ; Dialog ; FileDialog; Frame ; Label; List ; Scrollbar;
a d d M o u s e L i s t e n e r ( ) T e x t A r e a ; and T e x t F i e l d
r e m o v e M o u s e L i s t e n e r ( )
M o u s e E v e n t '55' (for both clicks C o m p o n e n t and its derivatives; including Button; Canvas;
and motion) Checkbox ; Choice; Co ntainer ; Panel ; Applet ; ScrollPane;
M o u s e M o t i o n L i s t e n e r Window ; Dialog ; FileDialog; Frame ; Label; List ; Scrollbar;
addMouseMotionListener( ) T e x t A r e a ; and T e x t F i e l d
removeMouseMotionListener( )
W i n d o w E v e n t Window and its derivatives; including Dialog; FileDialog; and
W i n d o w L i s t e n e r F r ame
a d d W i n d o w L i s t e n e r ( )
r e m o v e W i n d o w L i s t e n e r ( )
I t e m E v e n t Checkbox ; CheckboxMenuItem ; Choice ; List; and anything that
I t e m L i s t e n e r implements the I t e m S e l e c t a b l e interface
a d d I t e m L i s t e n e r ( )
r e m o v e I t e m L i s t e n e r ( )
T e x t E v e n t Anything derived from Textponent ; including TextArea and
T e x t L i s t e n e r T e x t F i e l d
a d d T e x t L i s t e n e r ( )
r e m o v e T e x t L i s t e n e r ( )
⑤:即使表面上如此,但实际上并没有MouseMotiionEvent (鼠标运动事件)。单击和运动都合成到
MouseEvent 里,所以 MouseEvent 在表格中的这种另类行为并非一个错误。
可以看到,每种类型的组件只为特定类型的事件提供了支持。这有助于我们发现由每种组件支持的事件,如
下表所示:
组件类型 支持的事件
C o m p o n e n t t y p e E v e n t s s u p p o r t e d b y t h i s c o m p o n e n t
A d j u s t a b l e A d j u s t m e n t E v e n t
A p p l e t Conta inerEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
B u t t o n ActionEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
C a n v a s F o c u s E v e n t ; K e y E v e n t ; M o u s e E v e n t ; C o m p o n e n t E v e n t
C h e c k b o x ItemEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
CheckboxMenuItem A c t i o n E v e n t ; I t e m E v e n t
C h o i c e ItemEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
C o m p o n e n t F o c u s E v e n t ; K e y E v e n t ; M o u s e E v e n t ; C o m p o n e n t E v e n t
C o n t a i n e r ContainerEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
411
…………………………………………………………Page 413……………………………………………………………
D i a l o g Co ntainerEvent; WindowEvent; FocusEvent; KeyEvent; MouseEvent;
C o m p o n e n t E v e n t
F i l e D i a l o g ContainerEvent; WindowEvent; FocusEvent; KeyEvent; MouseEvent;
C o m p o n e n t E v e n t
F r a m e ContainerEvent; WindowEvent; FocusEvent; KeyEvent; MouseEvent;
C o m p o n e n t E v e n t
L a b e l F o c u s E v e n t ; K e y E v e n t ; M o u s e E v e n t ; C o m p o n e n t E v e n t
L i s t ActionEvent; FocusEvent; KeyEvent; MouseEvent; ItemEvent; ponentEvent
M e n u A c t i o n E v e n t
M e n u I t e m A c t i o n E v e n t
P a n e l ContainerEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
P o p u p M e n u Act i o n E v e n t
S c r o l l b a r AdjustmentEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
S c r o l l P a n e ContainerEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
T e x t A r e a TextEvent; FocusEvent; KeyEvent; MouseEvent; ponentEvent
T e
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!