熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

技巧:如何在Applet中引用jar中的資源文件

2013-11-23 19:08:00  來源: Java核心技術 

  如果想要做一個比較漂亮的Applet讓人家使用一定會加上很多資源比如圖片或者聲音文件什麼的
  
  
  
  sun提供了一個有用的工具jar這個工具可以把這些資源文件合在一個文件裡避免頻繁的http request
  
  而且下載的jar文件可以被緩存很爽吧
  
  
  
  但是如何正確引用jar中的資源呢?
  
  
  
  比如我們打算顯示一個圖片按鈕圖片相對路徑為/img/logogif你可以自己隨便找一個gif圖片
  
  
  
  讓我們來看看我們想當然的做法
  
  
  
  
  
  import javaawt*;
  
  import javaawtevent*;
  
  
  
  import javaxswing*;
  
  
  
  public class ImageButtonApplet extends JApplet
  
  {
  
  private String path = /img/logogif;
  
  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 = thisgetContentPane();
  
  cpadd(iButton);
  
  }
  
  catch (Exception e)
  
  {
  
  eprintStackTrace();
  
  }
  
  }
  
  }
  
  
  
  這樣子編譯之後把ImageButtonAppletclass和logogif保持相對路徑打進jar裡面對應的HTML頁面代碼為由於使用了Swing
  
  經過HTMLConverter預處理之後本以為能夠一舉成功打開頁面卻發現拋出異常
  
  javasecurityAccessControlException: access denied (javaioFilePermission /img/logogif 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 ClassLoadergetSystemResource
  
  
  
  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));
  
  
  
  編譯jarrun成功無論是本機打開還是放到http服務器中都沒有問題了
  
  
  
  這就是在Applet中引用jar中資源文件的KEY!
  

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26330.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.