友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
Java编程思想第4版[中文版](PDF格式)-第69部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
385
…………………………………………………………Page 387……………………………………………………………
TextArea t2 = new TextArea(〃t2〃; 4; 30);
public void init() {
add(b1);
add(t1);
add(b2);
add(t2);
add(b3);
add(b4);
}
public boolean action (Event evt; Object arg) {
if(evt。target。equals(b1))
getAppletContext()。showStatus(t1。getText());
else if(evt。target。equals(b2)) {
t2。setText(〃Inserted by Button 2〃);
t2。appendText(〃: 〃 + t1。getText());
getAppletContext()。showStatus(t2。getText());
}
else if(evt。target。equals(b3)) {
String s = 〃 Replacement 〃;
t2。replaceText(s; 3; 3 + s。length());
}
else if(evt。target。equals(b4))
t2。insertText(〃 Inserted 〃; 10);
// Let the base class handle it:
else
return super。action(evt; arg);
return true; // We've handled it here
}
} ///:~
程序中有几个不同的“文本区域”构建器,这其中的一个在此处显示了一个初始字符串和行号和列号。不同
的按钮显示得到、追加、修改和插入文字。
13。7 标签
标签准确地运作:安放一个标签到窗体上。这对没有标签的TextFields 和Text areas 来说非常的重要,如
果我们简单地想安放文字的信息在窗体上也能同样的使用。我们能像本章中第一个例程中演示的那样,使用
drawString()里边的 paint()在确定的位置去安置一个文字。当我们使用的标签允许我们通过布局管理加入
其它的文字组件。(在这章的后面我们将进入讨论。)
使用构建器我们能创建一条包括初始化文字的标签(这是我们典型的作法),一个标签包括一行 CENTER (中
间)、LEFT (左)和RIGHT(右)(静态的结果取整定义在类标签里)。如果我们忘记了可以用getText()和
getalignment()读取值,我们同样可以用 setText()和 setAlignment()来改变和调整。下面的例子将演示标
签的特点:
//: Label1。java
// Using labels
import java。awt。*;
import java。applet。*;
public class Label1 extends Applet {
TextField t1 = new TextField(〃t1〃; 10);
Label labl1 = new Label(〃TextField t1〃);
Label labl2 = new Label(〃 〃);
386
…………………………………………………………Page 388……………………………………………………………
Label labl3 = new Label(〃 〃;
Labe l。RIGHT);
Button b1 = new Button(〃Test 1〃);
Button b2 = new Button(〃Test 2〃);
public void init() {
add(labl1); add(t1);
add(b1); add(labl2);
add(b2); add(labl3);
}
public boolean action (Event evt; Object arg) {
if(evt。target。equa ls(b1))
labl2。setText(〃Text set into Label〃);
else if(evt。target。equals(b2)) {
if(labl3。getText()。trim()。length() == 0)
labl3。setText(〃labl3〃);
if(labl3。getAlignment() == Label。LEFT)
labl3。setAlignment(Label。CENTER);
else if(labl3。getAlignment()==Label。CENTER)
labl3。setAlignment(Label。RIGHT);
else if(labl3。getAlignment() == Label。RIGHT)
labl3。setAlignment(Label。LEFT);
}
else
return super。action(evt; arg);
return true;
}
} ///:~
首先是标签的最典型的用途:标记一个文本字段或文本区域。在例程的第二部分,当我们按下“test 1”按
钮通过 setText()将一串空的空格插入到的字段里。因为空的空格数不等于同样的字符数(在一个等比例间
隔的字库里),当插入文字到标签里时我们会看到文字将被省略掉。在例子的第三部分保留的空的空格在我
们第一次按下“test 2”会发现标签是空的(trim()删除了每个字符串结尾部分的空格)并且在开头的左列
插入了一个短的标签。在工作的其余时间中我们按下按钮进行调整,因此就能看到效果。
我们可能会认为我们可以创建一个空的标签,然后用setText()安放文字在里面。然而我们不能在一个空标
签内加入文字-这大概是因为空标签没有宽度-所以创建一个没有文字的空标签是没有用处的。在上面的例
子里,“blank”标签里充满空的空格,所以它足够容纳后面加入的文字。
同样的,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 boolean action (Event evt; Object arg) {
if(evt。target。equals(lst)) {
t。setText(〃〃);
String'' items = lst。getSelectedItems();
for(int i = 0; i 《 items。length; i++)
t。appendText(items'i' + 〃n〃);
}
else if(evt。target。equals(b)) {
if(count 《 flavors。length)
lst。addItem(flavors'count++'; 0);
}
else
return super。action(evt; arg);
return true;
}
} ///:~
按下按钮时,按钮增加项目到列表的顶部(因为addItem()的第二个自变量为零)。增加项目到列表框比到
选择框更加的合理,因为用户期望去滚动一个列表框(因为这个原因,它有内建的滚动条)但用户并不愿意
像在前面的例子里不得不去计算怎样才能滚动到要要的那个项目。
然而,调用 action()的唯一方法就是通过双击。如果我们想监视用户在我们的列表中的所作所为(尤其是单
击),我们必须提供一个可供选择的方法。
13。11。1 handleEvent()
到目前为止,我们已使用了action(),现有另一种方法 handleEvent()可对每一事件进行尝试。当一个事件
发生时,它总是针对单独事件或发生在单独的事件对象上。该对象的 handleEvent() 方法是自动调用的,并
且是被 handleEvent() 创建并传递到handleEvent()里。默认的 handleEvent() (handleEvent()定义在组件
里,基础类的所有控件都在AWT 里)将像我们以前一样调用action()或其它同样的方法去指明鼠标的活动、
键盘活动或者指明移动的焦点。我们将会在本章的后面部分看到。
如果其它的方法-特别是action() -不能满足我们的需要怎么办呢?至于列表框,例如,如果我想捕捉鼠标
单击,但action()只响应双击怎么办呢?这个解答是过载handleEvent() ,毕竟它是从程序片中得到的,因
此可以过载任何非确定的方法。当我们为程序片过载handleEvent()时,我们会得到所有的事件在它们发送
出去之前,所以我们不能假设“这里有我的按钮可做的事件,所以我们可以假设按钮被按下了”从它被
action()设为真值。在handleEvent() 中按钮拥有焦点且某人对它进行分配都是可能的。不论它合理与否,
我们可测试这些事件并遵照handleEvent()来进行操作。
为了修改列表样本,使它会响应鼠标的单击,在action() 中按钮测试将被过载,但代码会处理的列表将像下
面的例子被移进handleEvent() 中去:
//: List2。java
// Using lists with handleEvent()
import java。awt。*;
import java。applet。*;
public class List2 extends Applet {
391
…………………………………………………………Page 393……………………………………………………………
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);
}
public boolean handleEvent(Event evt) {
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!