友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
Java编程思想第4版[中文版](PDF格式)-第105部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
//: BadIdea2。java
// An improvement over BadIdea1。java; since it
// uses the WindowAdapter as an inner class
// instead of implementing all the methods of
// WindowListener; but still misses the
// valuable modularity of inner classes
import java。awt。*;
import java。awt。event。*;
import java。util。*;
public class BadIdea2 extends Frame
implements ActionListener {
Button
b1 = new Button(〃Button 1〃);
b2 = new Button(〃Button 2〃);
437
…………………………………………………………Page 439……………………………………………………………
public BadIdea2() {
setLayout(new FlowLayout());
addWindowListener(new WL());
b1。addActionListener(this);
b2。addActionListener(this);
add(b1);
add(b2);
}
public void actionPerformed(ActionEvent e) {
Object source = e。getSource();
if(source == b1)
System。out。println(〃Button 1 pressed〃);
else if(source == b2)
System。out。println(〃Button 2 pressed〃);
else
System。out。println(〃Something else〃);
}
class WL extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System。out。println(〃Window Closing〃);
System。exit(0);
}
}
public static void main(String'' args) {
Frame f = new BadIdea2();
f。setSize(300;200);
f。setVisible(true);
}
} ///:~
因为actionPerformed()动作完成方法同主类紧密地结合,所以难以复用代码。它的代码读起来同样是凌乱
和令人厌烦的,远远超过了内部类方法。不合理的是,我们不得不在 Java 1。1 版中为事件使用那些老的思
路。
4。 继承一个组件
创建一个新类型的组件时,在运行事件的老方法中,我们会经常看到不同的地方发生了变化。这里有一个程
序例子来演示这种新的工作方法:
//: GoodTechnique。java
// Your first choice when overriding ponents
// should be to install listeners。 The code is
// much safer; more modular and maintainable。
import java。awt。*;
import java。awt。event。*;
class Display {
public static final int
EVENT = 0; PONENT = 1;
MOUSE = 2; MOUSE_MOVE = 3;
FOCUS = 4; KEY = 5; ACTION = 6;
LAST = 7;
public String'' evnt;
438
…………………………………………………………Page 440……………………………………………………………
Display() {
evnt = new String'LAST';
for(int i = 0; i 《 LAST; i++)
evnt'i' = new String();
}
public void show(Graphics g) {
for(int i = 0; i 《 LAST; i++)
g。drawString(evnt'i'; 0; 10 * i + 10);
}
}
class EnabledPanel extends Panel {
Color c;
int id;
Display display = new Display();
public EnabledPanel(int i; Color mc) {
id = i;
c = mc;
setLayout(new BorderLayout());
add(new MyButton(); BorderLayout。SOUTH);
addponentListener(new CL());
addFocusListener(new FL());
addKeyListener(new KL());
addMouseListener(new ML());
addMouseMotionListener(new MML());
}
// To eliminate flicker:
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
g。setColor(c);
Dimension s = getSize();
g。fillRect(0; 0; s。width; s。height);
g。setColor(Color。black);
display。show(g);
}
// Don't need to enable anything for this:
public void processEvent(AWTEvent e) {
display。evnt'Display。EVENT'= e。toString();
repaint();
super。processEvent(e);
}
class CL implements ponentListener {
public void ponentMoved(ponentEvent e){
display。evnt'Display。PONENT' =
〃ponent moved〃;
repaint();
}
public void
ponentResized(ponentEvent e) {
display。evnt'Display。PONENT' =
439
…………………………………………………………Page 441……………………………………………………………
〃ponent resized〃;
repaint();
}
public void
ponentHidden(ponentEvent e) {
display。evnt'Display。PONENT' =
〃ponent hidden〃;
repaint();
}
public void ponentShown(ponentEvent e){
display。evnt'Display。PONENT' =
〃ponent shown〃;
repaint();
}
}
class FL implements FocusListener {
public void focusGained(FocusEvent e) {
display。evnt'Display。FOCUS' =
〃FOCUS gained〃;
repaint();
}
public void focusLost(FocusEvent e) {
display。evnt'Display。FOCUS' =
〃FOCUS lost〃;
repaint();
}
}
class KL implements KeyListener {
public void keyPressed(KeyEvent e) {
display。evnt'Display。KEY' =
〃KEY pressed: 〃;
showCode(e);
}
public void keyReleased (KeyEvent e) {
display。evnt'Display。KEY' =
〃KEY released: 〃;
showCode(e);
}
public void keyTyped(KeyEvent e) {
display。evnt'Display。KEY' =
〃KEY typed: 〃;
showCode(e);
}
void showCode(KeyEvent e) {
int code = e。getKeyCode();
display。evnt'Display。KEY' +=
KeyEvent。getKeyText(code);
repaint();
}
}
class ML implements MouseListener {
public void mouseClicked(MouseEvent e) {
440
…………………………………………………………Page 442……………………………………………………………
requestFocus(); // Get FOCUS on click
display。evnt'Display。MOUSE' =
〃MOUSE clicked〃;
showMouse(e);
}
public void mousePressed(MouseEvent e) {
display。evnt'Display。MOUSE' =
〃MOUSE pressed〃;
showMouse(e);
}
public void mouseReleased(MouseEvent e) {
display。evnt'Display。MOUSE' =
〃MOUSE released〃;
showMouse(e);
}
public void mouseEntered(MouseEvent e) {
display。evnt'Display。MOUSE' =
〃MOUSE entered〃;
showMouse(e);
}
public void mouseExited(MouseEvent e) {
display。evnt'Display。MOUSE' =
〃MOUSE exited〃;
showMouse(e);
}
void showMouse(MouseEvent e) {
display。evnt'Display。MOUSE' +=
〃; x = 〃 + e。getX() +
〃; y = 〃 + e。getY();
repaint();
}
}
class MML implements MouseMotionListener {
public void mouseDragged(MouseEvent e) {
display。evnt'Display。MOUSE_MOVE' =
〃MOUSE dragged〃;
showMouse(e);
}
public void mouseMoved(MouseEvent e) {
display。evnt'Display。MOUSE_MOVE' =
〃MOUSE moved〃;
showMouse(e);
}
void showMouse(MouseEvent e) {
display。evnt'Display。MOUSE_MOVE' +=
〃; x = 〃 + e。getX() +
〃; y = 〃 + e。getY();
repaint();
}
}
}
441
…………………………………………………………Page 443……………………………………………………………
class MyButton extends Button {
int clickCounter;
String label = 〃〃;
public MyButton() {
addActionListener(new AL());
}
public void paint(Graphics g) {
g。setColor(Color。green);
Dimension s = getSize();
g。fillRect(0; 0; s。width; s。height);
g。setColor(Color。black);
g。drawRect(0; 0; s。width 1; s。height 1);
drawLabel(g);
}
private void drawLabel(Graphics g) {
FontMetrics fm = g。getFontMetrics();
int width = fm。stringWidth(label);
int height = fm。getHeight();
int ascent = fm。getAscent();
int leading = fm。getLeading();
int horizMargin =
(getSize()。width width)/2;
int verMargin =
(getSize()。height height)/2;
g。setColor(Color。red);
g。drawString(label; horizMargin;
verMarg in + ascent + leading);
}
class AL implements ActionListener {
public void actionPerformed(ActionEvent e) {
clickCounter++;
label = 〃click #〃 + clickCounter +
〃 〃 + e。toString();
repaint();
}
}
}
public class GoodTechnique extends Frame {
GoodTechnique() {
setLayout(new GridLayout(2;2));
add(new EnabledPanel(1; Color。cyan));
add(new EnabledPanel(2; Color。lightGray));
add(new EnabledPanel(3; Color。yellow));
}
public static void main(String'' args) {
Frame f = new GoodTechnique();
f。setTitle(〃Good Technique〃);
f。addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e){
System。out。println(e);
442
…………………………………………………………Page 444……………………………………………………………
System。out。println(〃Window Closing〃);
System。exit(0);
}
});
f。setSize(700;700);
f。setVisible(true);
}
} ///:~
这个程序例子同样证明了各种各样的发现和显示关于它们的信息的事件。这种显示是一种集中显示信息的方
法。一组字符串去获取关于每种类型的事件的信息,并且 show()方法对任何图像对象都设置了一个句柄,我
们采用并直接地写在外观代码上。这种设计是有意的被某种事件重复使用。
激活面板代表了这种新型的组件。它是一个底部有一个按钮的彩色的面板,并且它由利用接收器类为每一个
单独的事件来引发捕捉所有发生在它之上的事件,除了那些在激活面板过载的老式的 processEvent()方法
(注意它应该同样调用super。processEvent())。利用这种方法的唯一理由是它捕捉发生的每一个事件,因
此我们可以观察持续发生的每一事件。processEvent()方法没有更多的展示代表每个事件的字符串,否则它
会不得不使用一串条件语句去寻找事件。在其它方面,内嵌接收类早已清晰地知道被发现的事件。(假定我
们注册它们到组件,我们不需要任何的控件的逻辑,这将成为我们的目的。)因此,它们不会去检查任何事
件;这些事件正好做它们的原材料。
每个接收器修改显示字符串和它的指定事件,并且调用重画方法repaint()因此将显示这个字符串。我们同
样能注意到一个通常能消除闪烁的秘诀:
public void update(Graphics g) {
paint(g);
}
我们不会始终需要过载 update() ,但如果我们写下一些闪烁的程序,并运行它。默认的最新版本的清除背景
然后调用paint()方法重新画出一些图画。这个清除动作通常会产生闪烁,但是不必要的,因为paint()重画
了整个的外观。
我们可以看到许多的接收器——但是,对接收器输入检查指令,但我们却不能接收任何组件不支持的事件。
(不像BadTechnuque。java 那样我们能时时刻刻看到)。
试验
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!