Javaでjarに詰め込んでおいたHTMLファイルを表示する(イメージも扱う)
Javaで書いたプログラムにヘルプをつける場合に、 そのヘルプコンテンツをHTMLで用意することがあります。
そのような場合、ヘルプ用HTMLコンテンツやそこからリンクしているイラストを すべて、jarに詰め込んでおいて プログラムから使いたくなりますが、そのためには、 ちょっとしたコツがいるので、整理しておきます。
STEP1 HTMLを表示するためのブラウザコンポーネントの用意
JavaではJEditorPaneを使うことで、簡易HTMLブラウザをつくることができます。 最新のHTML仕様には対応していませんが、HTMLで書いたヘルプコンテンツ くらいの表示には十分間に合います。
JEditorPane browser=new JEditorPane();
browser.setEditable(false);
browser.setContentType("text/html");
String helpHtmlData="<html><body>help</body></html>";
browser.setText(helpHtmlData);
STEP2 ヘルプ用HTMLコンテンツの用意
先ほどの例では、ヘルプコンテンツをコード中に直接記述していましたが、 普通は、コードと切り離して作成します。
help.html
<html>
<body>
<h1>ヘルプ</h1>
<p>
こんにちは、以下にこのツールの操作方法を説明します。
</p>
<img src="fig.gif">
</body>
</html>
jarに help.html や fig.gif を含める場合、 このHTMLの書き方ではうまくいきません。
イメージエレメントのsrc属性の指定を工夫する必要があります。
help1.html
<html>
<body>
<h1>ヘルプ</h1>
<p>
こんにちは、以下にこのツールの操作方法を説明します。
</p>
<img src="jar:file:help.jar!/fig.gif">
</body>
</html>
ポイントは、
jar:file:help.jar!/fig.gif
です。
(ファイル名help.jarに help1.htmlやfig.gif を詰め込むことを前提にしています。)
STEP3 HelpBrowser.java
STEP2で作成したHTMLを読み込んで表示するためのブラウザクラスを用意します。
import java.io.*;
import java.awt.*;
import javax.swing.*;
public class HelpBrowser extends JFrame{
public HelpBrowser(){
super();
JEditorPane browser=new JEditorPane();
browser.setEditable(false);
browser.setContentType("text/html");
//String helpHtmlData="<html><body>help</body></html>";
String helpHtmlData=getHelpData();
browser.setText(helpHtmlData);
//gui
getContentPane().add(new JScrollPane(browser),BorderLayout.CENTER);
}
private String getHelpData(){
try{
String filename="help1.html";
BufferedReader r= new BufferedReader(new InputStreamReader(
this.getClass().getClassLoader().getResourceAsStream(filename),
"UTF-8"
)) ;
String html= toString(r);
r.close();
return html;
}
catch(Exception ex){
ex.printStackTrace();
}
return "";
}
private static String toString(BufferedReader r) throws IOException{
StringBuffer sb=new StringBuffer();
while(true){
String line=r.readLine();
if(line==null)
break;
sb.append(line);
}
return sb.toString();
}
public static void main(String[] s){
JFrame f=new HelpBrowser();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500,400);
f.setVisible(true);
}
}
ポイントは、getHelpData()メソッドです。
help1.htmlをjarに詰め込んでいるので、クラスローダ経由でgetResourceAsStream()
メソッドを使って読み出す必要があります。
STEP4 すべてをjarにまとめる
それでは材料が揃ったので、すべてを組み立てます。
$ ls
HelpBrowser.java help1.html fig.gif
$ javac HelpBrowser.java
$ jar cf help.jar HelpBrowser.class help1.html fig.gif
$ java -cp help.jar HelpBrowser
完成

launch4jでexe化する場合の注意点
launch4jを 使って、jarをexeに含めて配布する場合は、注意が必要です。 HTML中で使用している画像がそのままでは表示されません。
表示させるには、help.jar を exe と同じフォルダに入れておく必要があります。