Java编程思想第4版[中文版](PDF格式)-第111部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
TextField
t1 = new TextField(30);
t2 = new TextField(30);
t3 = new TextField(30);
String s = new String();
public void init() {
b1。addActionListener(new B1());
b2。addActionListener(new B2());
t1。addTextListener(new T1());
t1。addActionListener(new T1A ());
t1。addKeyListener(new T1K());
add(b1);
add(b2);
add(t1);
add(t2);
add(t3);
}
class T1 implements TextListener {
public void textValueChanged(TextEvent e) {
t2。setText(t1。getText());
}
}
class T1A implements ActionListener {
private int count = 0;
public void actionPerformed(ActionEvent e) {
t3。setText(〃t1 Action Event 〃 + count++);
416
…………………………………………………………Page 418……………………………………………………………
}
}
class T1K extends KeyAdapter {
public void keyTyped(KeyEvent e) {
String ts = t1。getText();
if(e。getKeyChar() ==
KeyEvent。VK_BACK_SPACE) {
// Ensure it's not empty:
if( ts。length() 》 0) {
ts = ts。substring(0; ts。length() 1);
t1。setText(ts);
}
}
else
t1。setText(
t1。getText() +
Character。toUpperCase(
e。getKeyChar()));
t1。setCaretPosition(
t1。getText()。length());
// Stop regular character from appearing:
e。consume();
}
}
class B1 implements ActionListener {
public void actionPerformed(ActionEvent e) {
s = t1。getSelectedText();
if(s。length() == 0) s = t1。getText();
t1。setEditable(true);
}
}
class B2 implements ActionListener {
public void actionPerformed(ActionEvent e) {
t1。setText(〃Inserted by Button 2: 〃 + s);
t1。setEditable(false);
}
}
public static void main(String'' args) {
TextNew applet = new TextNew();
Frame aFrame = new Frame(〃TextNew〃);
aFrame。addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System。exit(0);
}
});
aFrame。add(applet; BorderLayout。CENTER);
aFrame。setSize(300;200);
applet。init();
applet。start();
aFrame。setVisible(true);
}
417
…………………………………………………………Page 419……………………………………………………………
} ///:~
当TextField t1 的动作接收器被激活时,TextField t3 就是一个需要报告的场所。我们注意到仅当我们按
下“enter”键时,动作接收器才会为“TextField”所激活。
TextField t1 附有几个接收器。T1 接收器从 t1 复制所有文字到t2,强制所有字符串转换成大写。我们会发
现这两个工作同是进行的,并且如果我们增加 T1K 接收器后我们再增加T1 接收器,它就不那么重要:在文字
字段内的所有的字符串将一直被强制变为大写。这看起来键盘事件一直在文字组件事件前被激活,并且如果
我们需要保留t2 的字符串原来输入时的样子,我们就必须做一些特别的工作。
T1K 有着其它的一些有趣的活动。我们必须测试backspace (因为我们现在控制着每一个事件)并执行删除。
caret 必须被明确地设置到字段的结尾;否则它不会像我们希望的运行。最后,为了防止原来的字符串被默
认的机制所处理,事件必须利用为事件对象而存在的consume()方法所“耗尽”。这会通知系统停止激活其
余特殊事件的事件处理器。
这个例子同样无声地证明了设计内部类的带来的诸多优点。注意下面的内部类:
class T1 implements TextL istener {
public void textValueChanged(TextEvent e) {
t2。setText(t1。getText());
}
}
t1 和 t2 不属于 T1 的一部分,并且到目前为止它们都是很容易理解的,没有任何的特殊限制。这是因为一个
内部类的对象能自动地捕捉一个句柄到外部的创建它的对象那里,因此我们可以处理封装类对象的方法和内
容。正像我们看到的,这十分方便(注释⑥)。
⑥:它也解决了“回调”的问题,不必为 Java 加入任何令人恼火的“方法指针”特性。
2。 文本区域
Java 1。1 版中Text Area 最重要的改变就滚动条。对于 TextArea 的构建器而言,我们可以立即控制
TextArea 是否会拥有滚动条:水平的,垂直的,两者都有或者都没有。这个例子更正了前面Java 1。0 版
TextArea1。java 程序片,演示了Java 1。1 版的滚动条构建器:
//: TextAreaNew。java
// Controlling scrollbars with the TextArea
// ponent in Java 1。1
import java。awt。*;
import java。awt。event。*;
import java。applet。*;
public class TextAreaNew extends Applet {
Button b1 = new Button(〃Text Area 1〃);
Button b2 = new Button(〃Text Area 2〃);
Button b3 = new Button(〃Replace Text〃);
Button b4 = new Button(〃Insert Text〃);
TextArea t1 = new TextArea(〃t1〃; 1; 30);
TextArea t2 = new TextArea(〃t2〃; 4; 30);
TextArea t3 = new TextArea(〃t3〃; 1; 30;
TextArea。SCROLLBARS_NONE);
TextArea t4 = new TextArea(〃t4〃; 10; 10;
TextArea。SCROLLBARS_VERTICAL_ONLY);
TextArea t5 = new TextArea(〃t5〃; 4; 30;
TextArea。SCROLLBARS_HORIZONTAL_ONLY);
TextArea t6 = new TextArea(〃t6〃; 10; 10;
418
…………………………………………………………Page 420……………………………………………………………
TextArea。SCROLLBARS_BOTH);
public void init() {
b1。addActionListener(new B1L());
add(b1);
add(t1);
b2。addActionListener(new B2L());
add(b2);
add(t2);
b3。addActionListener(new B3L());
add(b3);
b4。addActionListener(new B4L());
add(b4);
add(t3); add(t4); add(t5); add(t6);
}
class B1L implements ActionListener {
public void actionPerformed(ActionEvent e) {
t5。append(t1。getText() + 〃n〃);
}
}
class B2L implements ActionListener {
public void actionPerformed(ActionEvent e) {
t2。setText(〃Inserted by Button 2〃);
t2。append(〃: 〃 + t1。getText());
t5。append(t2。getText() + 〃n〃);
}
}
class B3L implements ActionListener {
public void actionPerformed(ActionEvent e) {
String s = 〃 Replacement 〃;
t2。replaceRange(s; 3; 3 + s。length());
}
}
class B4L implements ActionListener {
public void actionPerformed(ActionEvent e) {
t2。insert(〃 Inserted 〃; 10);
}
}
public static void main(String'' args) {
TextAreaNew applet = new TextAreaNew();
Frame aFrame = new Frame(〃TextAreaNew〃);
aFrame。addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System。exit(0);
}
});
aFrame。add(applet; BorderLayout。CENTER);
aFrame。setSize(300;725);
applet。init();
applet。start();
aFrame。setVisible(true);
}
419
…………………………………………………………Page 421……………………………………………………………
} ///:~
我们发现只能在构造TextArea 时能够控制滚动条。同样,即使TE AR 没有滚动条,我们滚动光标也将被制止
(可通过运行这个例子中验证这种行为)。
3。 复选框和单选钮
正如早先指出的那样,复选框和单选钮都是同一个类建立的。单选钮和复选框略有不同,它是复选框安置到
CheckboxGroup 中构成的。在其中任一种情况下,有趣的ItemEvent 事件为我们创建一个 ItemListener项目
接收器。
当处理一组复选框或者单选钮时,我们有一个不错的选择。我们可以创建一个新的内部类去为每个复选框处
理事件,或者创建一个内部类判断哪个复选框被单击并注册一个内部类单独的对象为每个复选对象。下面的
例子演示了两种方法:
//: RadioCheckNew。java
// Radio buttons and Check Boxes in Java 1。1
import java。awt。*;
import java。awt。event。*;
import java。applet。*;
public class RadioCheckNew extends Applet {
TextField t = new TextField(30);
Checkbox'' cb = {
new Checkbox(〃Check Box 1〃);
new Checkbox(〃Check Box 2〃);
new Checkbox(〃Check Box 3〃) };
CheckboxGroup g = new CheckboxGroup();
Checkbox
cb4 = new Checkbox(〃four〃; g; false);
cb5 = new Checkbox(〃five〃; g; true);
cb6 = new Checkbox(〃six〃; g; false);
public void init() {
t。setEditable(false);
add(t);
ILCheck il = new ILCheck();
for(int i = 0; i 《 cb。length; i++) {
cb'i'。addItemListener(il);
add(cb'i');
}
cb4。addItemListener(new IL4());
cb5。addItemListener(new IL5());
cb6。addItemListener(new IL6());
add(cb4); add(cb5); add(cb6);
}
// Checking the source:
class ILCheck implements ItemListener {
public void itemStateChanged (ItemEvent e) {
for(int i = 0; i 《 cb。length; i++) {
if(e。getSource()。equals(cb'i')) {
t。setText(〃Check box 〃 + (i + 1));
return;
}
}
420
…………………………………………………………Page 422……………………………………………………………
}
}
// vs。 an individual class for each item:
class IL4 implements ItemListener {
public void itemStateChanged(ItemEvent e) {
t。setText(〃Radio button four〃);
}
}
class IL5 implements ItemListener {
public void itemStateChanged(ItemEvent e) {
t。setText(〃Radio button five〃);
}
}
class IL6 implements ItemListener {
public void itemStateChanged(ItemEvent e) {
t。setText(〃Radio button six〃);
}
}
public static void main(String'' args) {
RadioCheckNew applet = new RadioCheckNew();
Frame aFrame = new Frame(〃RadioCheckNew〃);
aFrame。addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System。exi