按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
同样的,setAlignment()在我们用构建器创建的典型的文字标签上没有作用。这个标签的宽度就是文字的宽
度,所以不能对它进行任何的调整。但是,如果我们启动一个长标签,然后把它变成短的,我们就可以看到
调整的效果。
这些导致事件连同它们最小化的尺寸被挤压的状况被程序片使用的默认布局管理器所发现。有关布局管理器
的部分包含在本章的后面。
13。8 复选框
复选框提供一个制造单一选择开关的方法;它包括一个小框和一个标签。典型的复选框有一个小的“X”(或
者它设置的其它类型)或是空的,这依靠项目是否被选择来决定的。
我们会使用构建器正常地创建一个复选框,使用它的标签来充当它的自变量。如果我们在创建复选框后想读
出或改变它,我们能够获取和设置它的状态,同样也能获取和设置它的标签。注意,复选框的大写是与其它
的控制相矛盾的。
无论何时一个复选框都可以设置和清除一个事件指令,我们可以捕捉同样的方法做一个按钮。在下面的例子
里使用一个文字区域枚举所有被选中的复选框:
//: CheckBox1。java
387
…………………………………………………………Page 389……………………………………………………………
// Using check boxes
import java。awt。*;
import java。applet。*;
public class CheckBox1 extends Applet {
TextArea t = new TextArea(6; 20);
Checkbox cb1 = new Checkbox(〃Check Box 1〃);
Checkbox cb2 = new Checkbox(〃Check Box 2〃);
Checkbox cb3 = new Checkbox(〃Check Box 3〃);
public void init() {
add(t); add(cb1); add(cb2); add(cb3);
}
public boolean action (Event evt; Object arg) {
if(evt。target。equals(cb1))
trace(〃1〃; cb1。getState());
else if(evt。target。equals(cb2))
trace(〃2〃; cb2。getState());
else if(evt。target。equals(cb3))
trace(〃3〃; cb3。getState());
else
return super。action(evt; arg);
return true;
}
void trace(String b; boolean state) {
if(state)
t。appendText(〃Box 〃 + b + 〃 Setn〃);
else
t。appendText(〃Box 〃 + b + 〃 Clearedn〃);
}
} ///:~
trace()方法将选中的复选框名和当前状态用 appendText()发送到文字区域中去,所以我们看到一个累积的
被选中的复选框和它们的状态的列表。
13。9 单选钮
单选钮在GUI 程序设计中的概念来自于老式的电子管汽车收音机的机械按钮:当我们按下一个按钮时,其它
的按钮就会弹起。因此它允许我们强制从众多选择中作出单一选择。
AWT 没有单独的描述单选钮的类;取而代之的是复用复选框。然而将复选框放在单选钮组中(并且修改它的
外形使它看起来不同于一般的复选框)我们必须使用一个特殊的构建器象一个自变量一样的作用在
checkboxGroup 对象上。(我们同样能在创建复选框后调用 setCheckboxGroup()方法。)
一个复选框组没有构建器的自变量;它存在的唯一理由就是聚集一些复选框到单选钮组里。一个复选框对象
必须在我们试图显示单选钮组之前将它的状态设置成true,否则在运行时我们就会得到一个异常。如果我们
设置超过一个的单选钮为true,只有最后的一个能被设置成真。
这里有个简单的使用单选钮的例子。注意我们可以像其它的组件一样捕捉单选钮的事件:
//: RadioButton1。java
// Using radio buttons
import java。awt。*;
import java。applet。*;
public class RadioButton1 extends Applet {
TextField t =
388
…………………………………………………………Page 390……………………………………………………………
new TextField(〃Radio button 2〃; 30);
CheckboxGroup g = new CheckboxGroup();
Checkbox
cb1 = new Checkbox(〃one〃; g; false);
cb2 = new Checkbox(〃two〃; g; true);
cb3 = new Checkbox(〃three〃; g; false);
public void init() {
t。setEditable(false);
add(t);
add(cb1); add(cb2); add(cb3);
}
public boolean action (Event evt; Object arg) {
if(evt。target。equals(cb1))
t。setText(〃Radio button 1〃);
else if(evt。target。equals(cb2))
t。setText(〃Radio button 2〃);
else if(evt。target。equals(cb3))
t。setText(〃Radio button 3〃);
else
return super。action(evt; arg);
return true;
}
} ///:~
显示的状态是一个文字字段在被使用。这个字段被设置为不可编辑的,因为它只是用来显示数据而不是收
集。这演示了一个使用标签的可取之道。注意字段内的文字是由最早选择的单选钮“Radio button 2”初始
化的。
我们可以在窗体中拥有相当多的复选框组。
13。10 下拉列表
下拉列表像一个单选钮组,它是强制用户从一组可实现的选择中选择一个对象的方法。而且,它是一个实现
这点的相当简洁的方法,也最易改变选择而不至使用户感到吃力(我们可以动态地改变单选钮,但那种方法
显然不方便)。Java 的选择框不像Windows 中的组合框可以让我从列表中选择或输入自己的选择。在一个选
择框中你只能从列表中选择仅仅一个项目。在下面的例子里,选择框从一个确定输入的数字开始,然后当按
下一个按钮时,新输入的数字增加到框里。你将可以看到选择框的一些有趣的状态:
//: Choice1。java
// Using drop…down lists
import java。awt。*;
import java。applet。*;
public class Choice1 extends Applet {
String'' description = { 〃Ebullient〃; 〃Obtuse〃;
〃Recalcitrant〃; 〃Brilliant〃; 〃Somnescent〃;
〃Timorous〃; 〃Florid〃; 〃Putrescent〃 };
TextField t = new TextField(30);
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++)
389
…………………………………………………………Page 391……………………………………………………………
c。addItem(description'count++');
add(t);
add(c);
add(b);
}
public boolean action (Event evt; Object arg) {
if(evt。target。equals(c))
t。setText(〃index: 〃 + c。getSelectedIndex()
+ 〃 〃 + (String)arg);
else if(evt。target。equals(b)) {
if(count 《 description。length)
c。addItem(description'count++');
}
else
return super。action(evt; arg);
return true;
}
} ///:~
文本字字段中显示的“selected index;〃也就是当前选择的项目的序列号,在事件中选择的字符串就像
action()的第二个自变量的字串符描述的一样好。
运行这个程序片时,请注意对 Choice 框大小的判断:在 windows 里,这个大小是在我们拉下列表时确定的。
这意味着如果我们拉下列表,然后增加更多的项目到列表中,这项目将在那,但这个下拉列表不再接受(我
们可以通过项目来滚动观察——注释④)。然而,如果我们在第一次拉下下拉列表前将所的项目装入下拉列
表,它的大小就会合适。当然,用户在使用时希望看到整个的列表,所以会在下拉列表的状态里对增加项目
到选择框里加以特殊的限定。
④:这一行为显然是一种错误,会 Java 以后的版本里解决。
13。11 列表框
列表框与选择框有完全的不同,而不仅仅是当我们在激活选择框时的显示不同,列表框固定在屏幕的指定位
置不会改变。另外,一个列表框允许多个选择:如果我们单击在超过一个的项目上,未选择的则表现为高亮
度,我们可以选择象我们想要的一样的多。如果我们想察看项目列表,我们可以调用 getSelectedItem()来
产生一个被选择的项目列表。要想从一个组里删除一个项目,我们必须再一次的单击它。列表框,当然这里
有一个问题就是它默认的动作是双击而不是单击。单击从组中增加或删除项目,双击调用action() 。解决这
个问题的方法是象下面的程序假设的一样重新培训我们的用户。
//: List1。java
// Using lists with action()
import java。awt。*;
import java。applet。*;
public class List1 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;
390
…………………………………………………………Page 392……………………………………………………………
public void init() {
t。setEditable(false);
for(int i = 0; i 《 4; i++)
lst。addItem(flavors'count++');
add(t);
add(lst);
add(b);
}
public bool