2

問題: Java アプレットは、Windows プラットフォームでローカルに実行されている場合、その jar 内にあるリソースをロードできません。同じアプレットが、ローカルではなく Web サーバーから起動された場合、または Linux システムでローカルに起動された場合、リソースをロードできます。いずれの場合も、アプレットはアプレット タグを使用して起動されます。

再現する手順

1) 以下のアプレット クラス コードをビルドし、以下を含む jar を作成します。

  • TestApplet.class
  • iconimg.png
  • test.html
  • META-INF フォルダー (1 行の標準マニフェスト: "Manifest-Version: 1.0")

私が使用した画像pngファイルへのリンクは次のとおりです。

ファイル test.html には次の 1 行があります。

<h1>Text from test.html file</h1>

2) 次のように、test.jar と同じフォルダーに launch.html を作成します。

<html><center><title>Test Applet</title><applet
archive  = "test.jar"
code     = "TestApplet.class"
name     = "Test Applet"
width    = "250"
height   = "150"
hspace   = "0"
vspace   = "0"
align    = "middle"
mayscript = "true"
></applet></center></html>

3) launch.html と同じローカル フォルダーにある test.jar で、launch.html をクリックします。

4) imgicon.png と test.html の getResource() 呼び出しは両方とも null を返すことに注意してください。

5) launch.html と test.jar を Web サーバーにアップロードし、launch.html をロードして、リソースが見つかったことを確認します。

TestApplet.java

import java.applet.AppletContext;
import java.io.IOException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestApplet extends JApplet {
    public TestApplet() {
        try {
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public void init() {
        JPanel topPanel = new JPanel();
        JLabel iconLabel;
        URL url = TestApplet.class.getClassLoader().getResource("iconimg.png");
        if  (url != null)
            iconLabel = new JLabel(new ImageIcon(url));
        else
            iconLabel = new JLabel("getResource(iconimg.png)==null");
        topPanel.add(iconLabel);

        URL url2;
        url2 = TestApplet.class.getClassLoader().getResource("test.html");
        if (url2 == null) {
            JLabel errorLabel = new JLabel("getResource(test.html) == null");
            topPanel.add(errorLabel);
        } else {
            try {
                JEditorPane htmlPane = new JEditorPane(url2);
                topPanel.add(htmlPane);
            } catch (IOException ioe) {
                System.err.println("Error displaying " + url2);
            }
        }
        getContentPane().add(topPanel);
    }   
  private void jbInit() throws Exception { }
}
4

2 に答える 2