如果想要做一個比較漂亮的Applet讓人家使用
一定會加上很多資源
比如圖片或者聲音文件什麼的
sun提供了一個有用的工具
jar
這個工具可以把這些資源文件合在一個文件裡
避免頻繁的http request
而且下載的jar文件可以被緩存
很爽吧
但是如何正確引用jar中的資源呢?
比如我們打算顯示一個圖片按鈕
圖片相對路徑為
/img/logo
gif
你可以自己隨便找一個gif圖片
讓我們來看看我們想當然的做法
import java
awt
*;
import java
awt
event
*;
import javax
swing
*;
public class ImageButtonApplet extends JApplet
{
private String path =
/img/logo
gif
;
private ImageIcon logoButtonIcon = new ImageIcon(path);
/**Initialize the applet*/
public void init()
{
try
{
if (logoButtonIcon == null)
throw new Exception(
cannot get the image!
);
JButton iButton = new JButton(logoButtonIcon);
Container cp = this
getContentPane();
cp
add(iButton);
}
catch (Exception e)
{
e
printStackTrace();
}
}
}
這樣子編譯之後
把ImageButtonApplet
class和logo
gif保持相對路徑打進jar裡面
對應的HTML頁面代碼為
由於使用了Swing
經過HTMLConverter預處理之後
本以為能夠一舉成功
打開頁面卻發現
拋出異常
java
security
AccessControlException: access denied (java
io
FilePermission /img/logo
gif read)
這件事情也郁悶了我很久
反復試驗
不管path相對路徑還是什麼
都不能順利實現
後來我研究了jdk自帶的demo
發現demo在引用資源的時候
采用這樣的方法 getClass()
getResource(String sourceName);
getClass()是Object的方法
返回一個對象的運行時類型
即CLass對象
原來Class對象有getResource方法
在API文檔中就是這樣寫的
public URL getResource(String name)
Finds a resource with a given name
This method returns null if no resource with this name is found
The rules for searching resources associated with a given class are implemented by the * defining class loader of the class
This method delegates the call to its class loader
after making these changes to the resource name: if the resource name starts with
/
it is unchanged; otherwise
the package name is prepended to the resource name after converting
to
/
If this object was loaded by the bootstrap loader
the call is delegated to ClassLoader
getSystemResource
Parameters:
name
name of the desired resource
Returns:
a
URL object
Since:
JDK
See Also:
ClassLoader
如法炮制
我把原來的
private ImageIcon logoButtonIcon = new ImageIcon(path);
改成
private ImageIcon logoButtonIcon = new ImageIcon(getClass()
getResource(path));
編譯
jar
run
成功
無論是本機打開還是放到http服務器中
都沒有問題了
這就是在Applet中引用jar中資源文件的KEY!
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26330.html