從上一篇看到的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的結合跟大家作一個較為詳盡的探討。