Java编程思想第4版[中文版](PDF格式)-第122部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
征。
13。18。6 Bean 更多的知识
另外有关的争议是Bean 不能被编址。无论何时我们创建一个Bean ,都希望它会在一个多线程的环境中运
行。这意味着我们必须理解线程的出口,我们将在下一章中介绍。我们会发现有一段称为“Java Beans 的回
顾”的节会注意到这个问题和它的解决方案。
466
…………………………………………………………Page 468……………………………………………………………
13。19 Swing 入门(注释⑦)
通过这一章的学习,当我们的工作方法在AWT 中发生了巨大的改变后(如果可以回忆起很久以前,当Java 第
一次面世时 SUN 公司曾声明 Java 是一种“稳定,牢固”的编程语言),可能一直有 Java 还不十分的成熟的
感觉。的确,现在 Java 拥有一个不错的事件模型以及一个优秀的组件复用设计——JavaBeans。但GUI 组件
看起来还相当的原始,笨拙以及相当的抽象。
⑦:写作本节时,Swing 库显然已被 Sun “固定”下来了,所以只要你下载并安装了Swing 库,就应该能正确
地编译和运行这里的代码,不会出现任何问题(应该能编译Sun 配套提供的演示程序,以检测安装是否正
确)。若遇到任何麻烦,请访问http://BruceEckel。,了解最近的更新情况。
而这就是Swing 将要占领的领域。Swing 库在 Java 1。1 之后面世,因此我们可以自然而然地假设它是 Java
1。2 的一部分。可是,它是设计为作为一个补充在 Java 1。1 版中工作的。这样,我们就不必为了享用好的 UI
组件库而等待我们的平台去支持Java 1。2 版了。如果 Swing 库不是我们的用户的Java 1。1 版所支持的一部
分,并且产生一些意外,那他就可能真正的需要去下载Swing 库了。
Swing 包含所有我们缺乏的组件,在整个本章余下的部分中:我们期望领会现代化的UI,来自按钮的任何事
件包括到树状和网格结构中的图片。它是一个大库,但在某些方面它为任务被设计得相应的复杂——如果任
何事都是简单的,我们不必编写更多的代码但同样设法运行我们的代码逐渐地变得更加的复杂。这意味着一
个容易的入口,如果我们需要它我们得到它的强大力量。
Swing 相当的深奥,这一节不会去试图让读者理解,但会介绍它的能力和Swing 简单地使我们着手使用库。
请注意我们有意识的使用这一切变得简单。如果我们需要运行更多的,这时Swing 能或许能给我们所想要
的,如果我们愿意深入地研究,可以从SUN 公司的在线文档中获取更多的资料。
13。19。1 Swing 有哪些优点
当我们开始使用Swing 库时,会注意到它在技术上向前迈出了巨大的一步。Swing 组件是 Bean ,因此他们可
以支持Bean 的任何开发环境中使用。Swing 提供了一个完全的UI 组件集合。因为速度的关系,所有的组件
都很小巧的(没有“重量级”组件被使用),Swing 为了轻便在 Java 中整个被编写。
最重要的是我们会希望 Swing 被称为“正交使用”;一旦我们采用了这种关于库的普遍的办法我们就可以在
任何地方应用它们。这主要是因为 Bean 的命名规则,大多数的时候在我编写这些程序例子时我可以猜到方法
名并且第一次就将它拼写正确而无需查找任何事物。这无疑是优秀库设计的品质证明。另外,我们可以广泛
地插入组件到其它的组件中并且事件会正常地工作。
键盘操作是自动被支持的——我们可以使用 Swing 应用程序而不需要鼠标,但我们不得不做一些额外的编程
工作(老的 AWT 中需要一些可怕的代码以支持键盘操作)。滚动被毫不费力地支持——我们简单地将我们的
组件到一个 JScrollPane 中,同样我们再增加它到我们的窗体中即可。其它的特征,例如工具提示条只需要
一行单独的代码就可执行。
Swing 同样支持一些被称为“可插入外观和效果”的事物,这就是说UI 的外观可以在不同的平台和不同的操
作系统上被动态地改变以符合用户的期望。它甚至可以创造我们自己的外观和效果。
13。19。2 方便的转换
如果我们长期艰苦不懈地利用 Java 1。1 版构建我们的UI,我们并不需要扔掉它改变到Swing 阵营中来。幸
运的是,库被设计得允许容易地修改——在很多情况下我们可以简单地放一个“J”到我们老AWT 组件的每个
类名前面即可。下面这个例子拥有我们所熟悉的特色:
//: JButtonDemo。java
// Looks like Java 1。1 but with J's added
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import java。applet。*;
import javax。swing。*;
public class JButtonDemo extends Applet {
467
…………………………………………………………Page 469……………………………………………………………
JButton
b1 = new JButton(〃JButton 1〃);
b2 = new JButton(〃JButton 2〃);
JTextField t = new JTextField(20);
public void init() {
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e){
String name =
((JButton)e。getSource())。getText();
t。setText(name + 〃 Pressed〃);
}
};
b1。addActionListener(al);
add(b1);
b2。addActionListener(al);
add(b2);
add(t);
}
public static void main(String args'') {
JButtonDemo applet = new JButtonDemo();
JFrame frame = new JFrame(〃TextAreaNew〃);
frame。addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System。exit(0);
}
});
frame。getContentPane()。add(
applet; BorderLayout。CENTER);
frame。setSize(300;100);
applet。init();
applet。start();
frame。setVisible(true);
}
} ///:~
这是一个新的输入语句,但此外任何事物除了增加了一些“J”外,看起都像这 Java 1。1 版的AWT。同样,
我们不恰当的用add()方法增加到 Swing JFrame 中,除此之外我们必须像上面看到的一样先准备一些
“content pane”。我们可以容易地得到Swing 一个简单的改变所带来的好处。
因为程序中的封装语句,我们不得不调用像下面所写的一样调用这个程序:
java c13。swing。JbuttonDemo
在这一节里出现的所有的程序都将需要一个相同的窗体来运行它们。
13。19。3 显示框架
尽管程序片和应用程序都可以变得很重要,但如果在任何地方都使用它们就会变得混乱和毫无用处。这一节
余下部分取代它们的是一个Swing 程序例子的显示框架:
//: Show。java
// Tool for displaying Swing demos
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
468
…………………………………………………………Page 470……………………………………………………………
public class Show {
public static void
inFrame(JPanel jp; int width; int height) {
String title = jp。getClass()。toString();
// Remove the word 〃class〃:
if(title。indexOf(〃class〃) != …1)
title = title。substring(6);
JFrame frame = new JFrame(title);
frame。addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System。exit(0);
}
});
frame。getContentPane()。add(
jp; BorderLayout。CENTER);
frame。setSize(width; height);
frame。setVisible(true);
}
} ///:~
那些想显示它们自己的类将从 JPanel 处继承并且随后为它们自己增加一些可视化的组件。最后,它们创建一
个包含下面这一行程序的main():
Show。inFrame(new MyClass(); 500; 300);
最后的两个自变量是显示的宽度和高度。
注意JFrame 的标题是用 RTTI 产生的。
13。19。4 工具提示
几乎所有我们利用来创建我们用户接口的来自于Jponent 的类都包含一个称为setToolTipText(string)
的方法。因此,几乎任何我们所需要表示的(对于一个对象jc 来说就是一些来自Jponent 的类)都可以
安放在窗体中:
jc。setToolTipText(〃My tip〃);
并且当鼠标停在Jponent 上一个超过预先设置的一个时间,一个包含我们的文字的小框就会从鼠标下弹
出。
13。19。5 边框
Jponent 同样包括一个称为 setBorder()的方法,该方法允许我们安放一些各种各样有趣的边框到一些可
见的组件上。下面的程序例子利用一个创建JPanel 并安放边框到每个例子中的被称为 showBorder()的方
法,示范了一些有用的不同的边框。同样,它也使用RTTI 来找我们使用的边框名(剔除所有的路径信息),
然后将边框名放到面板中间的 JLable 里:
//: Borders。java
// Different Swing borders
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
import javax。swing。border。*;
public class Borders extends JPanel {
static JPanel showBorder(Border b) {
469
…………………………………………………………Page 471……………………………………………………………
JPanel jp = new JPanel();
jp。setLayout(new BorderLayout());
String nm = b。getClass()。toString();
nm = nm。substring(nm。lastIndexOf('。') + 1);
jp。add(new JLabel(nm; JLabel。CENTER);
BorderLayout。CENTER);
jp。setBorder(b);
return jp;
}
public Borders() {
setLayout(new GridLayout(2;4));
add(showBorder(new TitledBorder(〃Title〃)));
add(showBorder(new EtchedBorder()));
add(showBorder(new LineBorder(Color。blue)));
add(showBorder (
new MatteBorder(5;5;30;30;Color。green)));
add(showBorder(
new BevelBorder(BevelBorder。RAISED)));
add(showBorder(
new SoftBevelBorder(BevelBorder。LOWERED)));
add(showBorder(new poundBorder(
new EtchedBorder();
new LineBorder(Color。red))));
}
public static void main(String args'') {
Show。inFrame(new Borders(); 500; 300);
}
} ///:~
这一节中大多数程序例子都使用TitledBorder,但我们可以注意到其余的边框也同样易于使用。能创建我们
自己的边框并安放它们到按钮、标签等等内——任何来自 Jponent 的东西。
13。19。6 按钮
Swing 增加了一些不同类型的按钮,并且它同样可以修改选择组件的结构:所有的按钮、复选框、单选钮,
甚至从AbstractButton 处继承的菜单项(这是因为菜单项一般被包含在其中,它可能会被改进命名为
“AbstractChooser”或者相同的什么名字)。我们会注意使用菜单项的简便,下面的例子展示了不同类型的
可用的按钮:
//: Buttons。java
// Various Swing buttons
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
import javax。swing。plaf。basic。*;
import javax。swing。border。*;
public class Buttons extends JPanel {
JButton jb = new JButton(〃JButton〃);
BasicArrowButton
up = new BasicArrowButton(
BasicArrowButton。NORTH);
470
…………………………………………………………Page 472……………………………………………………………
down = new BasicArrowButton(
BasicArrowButton。SOUTH);
right = new BasicArrowButton(