站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题JAR进阶(下)

JAR进阶(下)

摘要: JAR进阶(下)

  从上一篇看到的JAR的基本用法,似乎并没让人有感觉到JAR的出现是给applet的应用带来了一个新的开始。但您也许看完了下面的,就会对JAR稍有认同了。

  很多试着在jbuilder里做过applet的java爱好者都知道,applet的界面布局是一个比较繁人的问题,远不是如VB里面把控件放到界面上那么简单,就算是用最"高级"的grid bag布局管理器,要在上面摆多个控件也是需要调整又调整的,而且就算是在jbuilder里面还看得可以接受,但换到浏览器里面也许又是另一个样子了,当然也有摆得好的,当毕竟是需要时间和经验的,可是在jbuilder里面如果对底板不选grid bag布局管理器,而选XY布局,那在上面摆控件就真的是一件很轻松的事情了,令人遗憾的是XY布局所调用的类是com.borland.jbcl.layout下面的,是由borland公司自己编写的,很显然这样编写的applet是轻松了编写,痛苦了应用,因为实在是无法让仅仅认得jdk1.0的IE去认识borland写的类,那么就真的只有写给自己看了吗,现在有了JAR,你会发现如按下面的步骤来,是可以很轻松的让别人也看到你写的包含非jdk标准类的applet。

  我们在第一步写的那界面上再添加几个按钮,先把底板的布局由grid bag改变成xy,再在上面添加几个按钮,把按钮的右击事件也设置为弹出菜单,以下是源程序,在jbuilder生成的代码上简化一下,去掉暂可不用的代码和一些注释,但保证可以正常运行,

package test1;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import com.borland.jbcl.layout.*;

public class Applet1 extends Applet {
boolean isStandalone = false;
PopupMenu popupMenu1 = new PopupMenu();
MenuItem menuItem1 = new MenuItem();
MenuItem menuItem2 = new MenuItem();
MenuItem menuItem3 = new MenuItem();
Button button1 = new Button();
XYLayout xYLayout1 = new XYLayout();/*面板改变为XYLayout布局,使用的是非jdk标准类*/
Button button2 = new Button();
Button button3 = new Button();/*添加三个按钮*/
public void init() {
menuItem1.setLabel("1");
menuItem2.setLabel("2");
menuItem3.setLabel("3");
button1.setLabel("button1");
button1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
button1_mousePressed(e);
}
});
this.setLayout(xYLayout1);
button2.setLabel("button2");
button2.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
button1_mousePressed(e);
}
});
button3.setLabel("button3");
button3.addMouseListener(new java.awt.event.MouseAdapter() {/*三个按钮的右键事件都为一个*/
public void mousePressed(MouseEvent e) {
button1_mousePressed(e);
}
});
popupMenu1.add(menuItem1);
popupMenu1.add(menuItem2);
popupMenu1.add(menuItem3);
this.add(button1, new XYConstraints(155, 5, -1, -1));
add(popupMenu1);
this.add(button2, new XYConstraints(49, 94, 101, 32));
this.add(button3, new XYConstraints(235, 92, 98, 36));
}
void button1_mousePressed(MouseEvent e) {
int mods=e.getModifiers();
if((mods&InputEvent.BUTTON3_MASK)!=0)
{
popupMenu1.show(button1,e.getX(),e.getY());
}
}
}


  通过在jbuilder的预览中可以看到,三个按钮未改动位置,而且右键单击也按要求在一个按钮上出现。很可惜的是这样的applet无法发布出来,我们试着打开class目录下的Applet1.html,IE报出一个出错信息:"load:test1.Applet1 cant"t be instantiated"。原因就是IE并不认识com.borland.jbcl.layout下面的类,而这里使用了XYLayout。.那么我们开始制作包含该XYLayout类的JAR来发布该applet。

  还是通过new一个 Archive Builder开始,

  Archive type : Applet

  Project classes and resources : Include required classes and known resources

  Required classes and resources : add test1.Applet1.class

  再点击next,就到了关键的一步,显示的JBCL和DataExpress都是applet所需要调用到的类,而且都是非jdk标准的,可以通过在这里选择后也包含到这个JAR文件中,供applet调用,默认的设定是Include required classes and all resources,即把applet所需要调用的类包含到JAR中,并且还包括这个类所中所包含的所有资源,而不管applet是否会用到。所以我们一般情况下只需要选择include required classes and known resources,资源文件要尽量少的包含到JAR中,以避免JAR文件过于庞大。记住是要让JBCL和DataExpress都选择为Include Deps。这样便很轻松的完成了相关类的添加工作。

  完成后可以在test1.jpr的目录数下找到Applet,builder它得到的test1.jar目录数中可以看到多出了com.borland.jbcl.layout这样的目录,在这个目录下包含着XYLayout.class和XYConstraints.class两个类文件,这就是这个applet所需要调用的非标准类了,还是要记住,每当重新编译了这个applet,都要再编译一次JAR,这样才能让新生成的applet文件包含到JAR中。

  接下来就只需要在有test1.jar这个文件的目录里面新建一个文件testjar.html :

  <applet code=test1.Applet1.class archive="test1.jar" width=350 height=200 > </applet>

  需要提醒的是,如果在IE里面浏览该html,如果有过重新编译JAR并要把变化反应到网页上来,又没有关闭先前开的浏览该html的IE窗口,就要在地址栏里面按Ctrl+F5来刷新该html。

  可以看到这样的应用真的给applet赋予了更强大的生命力,而且在jbuilder里面很容易的就实现了它。但是就applet的应用来讲,还是有个悬而未决的问题,很多朋友都知道,在applet里面不能添加进swing类,因为IE只是支持jdk1.0,而swing类是以 jdk1.1 轻型用户界面框架为基础的,不在IE的支持范围,那么自然也不能正常显示,现在问题是也不能用Jbuilder的Archive Builder来把applet所需要调用的swing类包含到JAR中。

  但也不是没有办法,一个较为简单的办法是装jre(Java Runtime Environment ),但是这个办法的缺点是要让每一个要浏览该applet的机器都要安装jre。另一个办法是重新复制编译一次swing类,生成自己的类,这样就可以被JAR打包时所包含到了,当然这需要的较多的时间和精力,这里举一个较为简单的例子,如果在applet里使用Jbutton,那么先把jdk里面一个src.jar这个文件解压,再在目录javax,swing下,找到Jbutton.java文件,查看它的源码,并把所有涉及到的swing类都复制到一个目录下,改变每一个文件的package属性。再编译,通过了就说明找到的文件全了,没有通过就必须再找到,直到不再编译出错为止。最后从applet引用这个已经编译的class,而不再用swing。好像这个办法是笨了点,但对大家熟悉java是很有帮助的。

  差不多JAR的用法可以说掌握到这样就可以了,当然还有更精彩的应用,如与数字签名结合可以突破以往对applet的限制,甚至可以访问本地硬盘,网络等等。如果大家对此感兴趣,我也会在稍后的文章中对数字签名和JAR的结合跟大家作一个较为详尽的探讨。
↑返回目录
前一篇: JNDI设计内幕
后一篇: JAR进阶 (上)