我们常常都需要建设一个类,使其既可作为一个窗口挪用,亦可作为一个措施片挪用。为做到这一点,只需为措施片简朴地插手一个main()即可,令其在一个Frame(帧)里构建措施片的一个实例。作为一个简朴的示例,下面让我们来看看如何对Button2New.java作一番修改,使其能同时作为应用措施和措施片利用:
//: Button2NewB.java // An application and an applet import java.awt.*; import java.awt.event.*; // Must add this import java.applet.*; public class Button2NewB extends Applet { Button b1 = new Button("Button 1"), b2 = new Button("Button 2"); TextField t = new TextField(20); public void init() { b1.addActionListener(new B1()); b2.addActionListener(new B2()); add(b1); add(b2); add(t); } class B1 implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Button 1"); } } class B2 implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Button 2"); } } // To close the application: static class WL extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } // A main() for the application: public static void main(String[] args) { Button2NewB applet = new Button2NewB(); Frame aFrame = new Frame("Button2NewB"); aFrame.addWindowListener(new WL()); aFrame.add(applet, BorderLayout.CENTER); aFrame.setSize(300,200); applet.init(); applet.start(); aFrame.setVisible(true); } } ///:~
内部类WL和main()要领是插手措施片的独一两个元素,措施片剩余的部门则原封未动。事实上,我们凡是将WL类和main()要领做一结小的改造复制和粘贴到我们本身的措施片里(请记着建设内部类时凡是需要一个外部类来处理惩罚它,形成它静态地消除这个需要)。我们可以看到在main()要领里,措施片明晰地初始化和开始,因为在这个例子里欣赏器不能为我们有效地运行它。虽然,这不会提供全部的欣赏器挪用stop()和destroy()的行为,但对大大都的环境而言它都是可接管的。假如它酿成一个贫苦,我们可以:
(1) 使措施片句柄为一个静态类(以取代局部可变的main()),然后:
(2) 在我们挪用System.exit()之前在WindowAdapter.windowClosing()中挪用applet.stop()和applet.destroy()。
留意最后一行:
aFrame.setVisible(true);
这是Java 1.1 AWT的一个改变。show()要领不再被支持,而setVisible(true)则代替了show()要领。当我们在本章后头部门进修Java Beans时,这些外貌上易于改变的要领将会变得越发的公道。
这个例子同样被利用TextField修改而不是显示到节制台或欣赏器状态行上。在开拓措施时有一个限制条件就是措施片和应用措施我们都必需按照它们的运行环境选择输入和输出布局。
这里展示了Java 1.1 AWT的其它小的新成果。我们不再需要去利用有错误倾向的操作字符串指定BorderLayout定位的要领。当我们增加一个元素到Java 1.1版的BorderLayout中时,我们可以这样写:
aFrame.add(applet, BorderLayout.CENTER);
我们对位置划定一个BorderLayout的常数,以使它能在编译时被检讨(而不是对老的布局暗暗地做不符合的事)。这是一个显著的改进,而且将在这本书的余下部门大量地利用。
2. 将窗口吸收器酿成匿名类
任何一个吸收器类都可作为一个匿名类执行,但这一直有个意外,那就是我们大概需要在其它场所利用它们的成果。可是,窗口吸收器在这里仅作为封锁应用措施窗口来利用,因此我们可以安详地制造一个匿名类。然后,main()中的下面这行代码:
aFrame.addWindowListener(new WL());
会酿成:
aFrame.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
这有一个利益就是它不需要其它的类名。我们必需对本身判定是否它使代码变得易于领略可能更难。不外,对本书余下部门而言,匿名内部类将凡是被利用在窗口吸收器中。
3. 将措施片封装到JAR文件里
一个重要的JAR应用就是完善措施片的装载。在Java 1.0版中,人们倾向于试法将它们的代码填入到单个的措施片类里,因此客户只需要单个的处事器就可适合下载措施片代码。但这不只使功效缭乱,难以阅读(虽然维护也然)措施,但类文件一直不能压缩,因此下载从来没有快过。
JAR文件将我们所有的被压缩的类文件打包到一个单个儿的文件中,再被欣赏器下载。此刻我们不需要建设一个糟糕的设计以最小化我们建设的类,而且用户将获得更快地下载速度。
仔细想想上面的例子,这个例子看起来像Button2NewB,是一个单类,但事实上它包括三个内部类,因此共有四个。每当我们编译措施,我会用这行代码打包它到一个JAR文件:
jar cf Button2NewB.jar *.class
这是假定只有一个类文件在当前目次中,个中之一来自Button2NewB.java(不然我们会获得出格的打包)。
此刻我们可以建设一个利用新文件标签来指定JAR文件的HTML页,如下所示:
<head><title>Button2NewB Example Applet </title></head> <body> <applet code="Button2NewB.class" archive="Button2NewB.jar" width=200 height=150> </applet> </body>
与HTML文件中的措施片标志有关的其他任何内容都保持稳定。