从上一篇看到的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的结合跟大家作一个较为详尽的探讨。
闽公网安备 35060202000074号