Java编程思想第4版[中文版](PDF格式)-第112部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
public void windowClosing(WindowEvent e) {
System。exit(0);
}
});
aFrame。add(applet; BorderLayout。CENTER);
aFrame。setSize(300;200);
applet。init();
applet。start();
aFrame。setVisible(true);
}
} ///:~
ILCheck拥有当我们增加或者减少复选框时自动调整的优点。当然,我们对单选钮使用这种方法也同样的
好。但是,它仅当我们的逻辑足以普遍的支持这种方法时才会被使用。如果声明一个确定的信号——我们将
重复利用独立的接收器类,否则我们将结束一串条件语句。
4。 下拉列表
下拉列表在 Java 1。1 版中当一个选择被改变时同样使用 ItemListener去告知我们:
//: ChoiceNew。java
// Drop…down lists with Java 1。1
import java。awt。*;
import java。awt。event。*;
import java。applet。*;
public class ChoiceNew extends Applet {
String'' description = { 〃Ebullient〃; 〃Obtuse〃;
〃Recalcitrant〃; 〃Brilliant〃; 〃Somnescent〃;
〃Timorous〃; 〃Florid〃; 〃Putrescent〃 };
421
…………………………………………………………Page 423……………………………………………………………
TextField t = new TextField(100);
Choice c = new Choice();
Button b = new Button(〃Add items〃);
int count = 0;
public void init() {
t。setEditable(false);
for(int i = 0; i 《 4; i++)
c。addItem(description'count++');
add(t);
add(c);
add(b);
c。addItemListener(new CL());
b。addActionListener(new BL());
}
class CL implements ItemListener {
public void itemStateChanged(ItemEvent e) {
t。setText(〃index: 〃 + c。getSelectedIndex()
+ 〃 〃 + e。toString());
}
}
class BL implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(count 《 description。length)
c。addItem(description'count++');
}
}
public static void main(String'' args) {
ChoiceNew applet = new ChoiceNew();
Frame aFrame = new Frame(〃ChoiceNew〃);
aFrame。addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System。exit(0);
}
});
aFrame。add(applet; BorderLayout。CENTER);
aFrame。setSize(750;100);
applet。init();
applet。start();
aFrame。setVisible(true);
}
} ///:~
这个程序中没什么特别新颖的东西(除了 Java 1。1 版的UI 类里少数几个值得关注的缺陷)。
5。 列表
我们消除了 Java 1。0 中List 设计的一个缺陷,就是 List 不能像我们希望的那样工作:它会与单击在一个列
表元素上发生冲突。
//: ListNew。java
// Java 1。1 Lists are easier to use
import java。awt。*;
422
…………………………………………………………Page 424……………………………………………………………
import java。awt。event。*;
import java。applet。*;
public class ListNew extends Applet {
String'' flavors = { 〃Chocolate〃; 〃Strawberry〃;
〃Vanilla Fudge Swirl〃; 〃Mint Chip〃;
〃Mocha Almond Fudge〃; 〃Rum Raisin〃;
〃Praline Cream〃; 〃Mud Pie〃 };
// Show 6 items; allow multiple selection:
List lst = new List(6; true);
TextArea t = new TextArea(flavors。length; 30);
Button b = new Button(〃test〃);
int count = 0;
public void init() {
t。setEditable(false);
for(int i = 0; i 《 4; i++)
lst。addItem(flavors'count++');
add(t);
add(lst);
add(b);
lst。addItemListener(new LL());
b。addActionListener(new BL());
}
class LL implements ItemListener {
public void itemStateChanged(ItemEvent e) {
t。setText(〃〃);
String'' items = lst。getSelectedItems();
for(int i = 0; i 《 items。length; i++)
t。append(items'i' + 〃n〃);
}
}
class BL implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(count 《 flavors。length)
lst。addItem(flavors'count++'; 0);
}
}
public static void main(String'' args) {
ListNew applet = new ListNew();
Frame aFrame = new Frame(〃ListNew〃);
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);
}
423
…………………………………………………………Page 425……………………………………………………………
} ///:~
我们可以注意到在列表项中无需特别的逻辑需要去支持一个单击动作。我们正好像我们在其它地方所做的那
样附加上一个接收器。
6。 菜单
为菜单处理事件看起来受益于 Java 1。1 版的事件模型,但 Java 生成菜单的方法常常麻烦并且需要一些手工
编写代码。生成菜单的正确方法看起来像资源而不是一些代码。请牢牢记住编程工具会广泛地为我们处理创
建的菜单,因此这可以减少我们的痛苦(只要它们会同样处理维护任务!)。另外,我们将发现菜单不支持
并且将导致混乱的事件:菜单项使用ActionListeners (动作接收器),但复选框菜单项使用 ItemListeners
(项目接收器)。菜单对象同样能支持ActionListeners (动作接收器),但通常不那么有用。一般来说,
我们会附加接收器到每个菜单项或复选框菜单项,但下面的例子(对先前例子的修改)演示了一个联合捕捉
多个菜单组件到一个单独的接收器类的方法。正像我们将看到的,它或许不值得为这而激烈地争论。
//: MenuNew。java
// Menus in Java 1。1
import java。awt。*;
import java。awt。event。*;
public class MenuNew extends Frame {
String'' flavors = { 〃Chocolate〃; 〃Strawberry〃;
〃Vanilla Fudge Swirl〃; 〃Mint Chip〃;
〃Mocha Almond Fudge〃; 〃Rum Raisin〃;
〃Praline Cream〃; 〃Mud Pie〃 };
TextField t = new TextField(〃No flavor〃; 30);
MenuBar mb1 = new MenuBar();
Menu f = new Menu(〃File〃);
Menu m = new Menu(〃Flavors〃);
Menu s = new Menu(〃Safety〃);
// Alternative approach:
CheckboxMenuItem'' safety = {
new CheckboxMenuItem(〃Guard〃);
new CheckboxMenuItem(〃Hide〃)
};
MenuItem'' file = {
// No menu shortcut:
new MenuItem(〃Open〃);
// Adding a menu shortcut is very simple:
new MenuItem(〃Exit〃;
new MenuShortcut(KeyEvent。VK_E))
};
// A second menu bar to swap to:
MenuBar mb2 = new MenuBar();
Menu fooBar = new Menu(〃fooBar〃);
MenuItem'' other = {
new MenuItem(〃Foo〃);
new MenuItem(〃Bar〃);
new MenuItem(〃Baz〃);
};
// Initialization code:
{
ML ml = new ML();
424
…………………………………………………………Page 426……………………………………………………………
CMIL cmil = new CMIL();
safety'0'。setActionmand(〃Guard〃);
safety'0'。addItemListener(cmil);
safety'1'。setActionmand(〃Hide〃);
safety'1'。addItemListener(cmil);
file'0'。setActionmand(〃Open〃);
file'0'。addActionListener(ml);
file'1'。setActionmand(〃Exit〃);
file'1'。addActionListener(ml);
other'0'。addActionListener(new FooL());
other'1'。addActionListener(new BarL());
other'2'。addActionListener(new BazL());
}
Button b = new Button(〃Swap Menus〃);
public MenuNew() {
FL fl = new FL();
for(int i = 0; i 《 flavors。length; i++) {
MenuItem mi = new MenuItem(flavors'i');
mi。addActionListener(fl);
m。add(mi);
// Add separators at intervals:
if((i+1) % 3 == 0)
m。addSeparator();
}
for(int i = 0; i 《 safety。length; i++)
s。add(safety'i');
f。add(s);
for(int i = 0; i 《 file。length; i++)
f。add(file'i');
mb1。add(f);
mb1。add(m);
setMenuBar(mb1);
t。setEditable(false);
add(t; BorderLayout。CENTER);
// Set up the system for swapping menus:
b。addActionListener(new BL());
add(b; BorderLayout。NORTH);
for(int i = 0; i 《 other。length; i++)
fooBar。add(other'i');
mb2。add(fooBar);
}
class BL implements ActionListener {
public void actionPerformed(ActionEvent e) {
MenuBar m = getMenuBar();
if(m == mb1) setMenuBar(mb2);
else if (m == mb2) setMenuBar(mb1);
}
}
class ML implements ActionListener {
public void actionPerformed(ActionEvent e) {
MenuItem target = (MenuItem)e。getSource();
String actionmand =
425
…………………………………………………………Page 427……………………………………………………………
target。getActionmand();
if(actionmand。equals(〃Open〃)) {
String s = t。getText();
boolean chosen = false;
for(int i = 0; i 《 flavors。length; i++)
if(s。equals(flavors'i')) chosen = true;
if(!chosen)
t。setText(〃Choose a flavor first!〃);
else
t。setText(〃Opening 〃+ s +〃。 Mmm; mm!〃);
} else if(actionmand。equals(〃Exit〃)) {
dispatchEvent(
new WindowEvent(MenuNew。this;
WindowEvent。WINDOW_CLOSING));
}
}
}
class FL implements ActionListener {
public void actionPerformed(ActionEvent e) {
MenuItem target = (MenuItem)e。getSource();
t。setText(target。getLabel());
}
}
// Alternatively; you can create a different
// class for each different MenuItem。 Then you
// Don't have to figure out which one it is:
class FooL implements ActionListener {
public void actionPerformed(ActionEvent e) {
t。setText(〃Foo selected〃);