友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第152章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




应用目录名并且JAR 放置子目录中的任何文件到JAR 文件中。我们可以看到 Frog 和 BangBean 都在它们自己 

的子目录中。  

一旦我们将我们的Bean 正确地放入一个 JAR 文件中,我们就可以携带它到一个可以激活Bean 的编程环境中 

使用。使用这种方法,我们可以从一种工具到另一种工具间交替变换,但 SUN 公司为 Java Beans 提供了免费 

高效的测试工具在它们的“Bean Development Kit,Bean 开发工具”(BDK)称为“beanbox”。(我们可以 

从javasoft。 处下载。)在我们启动 beanbox 前,放置我们的Bean 到beanbox 中,复制JAR 文件到 

BDK 的“jars”子目录中。  



13。18。5 更复杂的 Bean 支持  



我们可以看到创建一个 Bean 显然多么的简单。在程序设计中我们几乎不受到任何的限制。Java Bean 的设计 

提供了一个简单的输入点,这样可以提高到更复杂的层次上。这些高层次的问题超出了这本书所要讨论的范 

围,但它们会在此做简要的介绍。我们可以在 http://java。sun。/beans 上找到更多的详细资料。  

我们增加更加复杂的程序和它的属性到一个位置。上面的例子显示一个独特的属性,当然它也可能代表一个 

数组的属性。这称为索引属性。我们简单地提供一个相应的方法(再者有一个方法名的命名规则)并且 

Introspector认可索引属性,因此我们的应用程序构建工具相应的处理。  

属性可以被捆绑,这意味着它们将通过 PropertyChangeEvent 通知其它的对象。其它的对象可以随后根据对 

Bean 的改变选择修改它们自己。  

属性可以被束缚,这意味着其它的对象可以在一个属性的改变不能被接受时,拒绝它。其它的对象利用一个 

PropertyChangeEvent 来通知,并且它们产生一个ProptertyVetoException 去阻止修改的发生,并恢复为原 

来的值。  

我们同样能够改变我们的Bean 在设计时的被描绘成的方法:  

(1) 我们可以为我们特殊的 Bean 提供一个定制的属性表。这个普通的属性表将被所有的Bean 所使用,但当 

我们的Bean 被选择时,它会自动地调用这张属性表。  

(2) 我们可以为一个特殊的属性创建一个定制的编辑器,因此普通的属性表被使用,但当我们指定的属性被 

调用时,编辑器会自动地被调用。  

(3)我们可以为我们的 Bean 提供一个定制的BeanInfo 类,产生的信息不同于由 Introspector 默认产生的。  

(4) 它同样可能在所有的FeatureDescriptors 中改变“expert”的开关模式,以辨别基本特征和更复杂的特 

征。  



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)  

      titl
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!