2

イメージを含む Java プログラムを実行可能ファイルに変換するための jar にパッケージ化する際に、大きな問題が発生しています。画像は、プログラムとボタンの背景に使用されています。jar に変換したいプログラムを示す下の図を参照してください。

画像

ここに画像の説明を入力

上記のように、プログラムは正常に実行されます。カスタム背景と画像を含まないカスタム ボタンを使用して同じプログラムを作成し、それを jar にパッケージ化し、続いて .exe ファイルにパッケージ化しました。

背景の描画に関しては、次のようにしています。

public void paintComponent(Graphics g) {
    Image img = new ImageIcon("imgs/Bgnd1.jpg").getImage();
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
    g.drawImage(img, 0, 0, null);
} 

画像付きの 4 つのカスタム ボタンの作成に関しては、次のようにしています。

// Prepare rollover images
ImageIcon F1 = new ImageIcon("imgs/btn_f1_not_selected.jpg");
ImageIcon F1rollOver = new ImageIcon("imgs/btn_f1_selected.jpg");

// Create F1 button
final JButton btnF1 = new JButton(F1);
//btnF1.setOpaque(false);
btnF1.setContentAreaFilled(false);
btnF1.setBorder(null);
btnF1.setBorderPainted(false);
btnF1.setFocusPainted(false);
btnF1.setRolloverIcon(F1rollOver);

画像をbinフォルダーに配置しようとしましたが、背景を作成するために、画像の宣言/取得に関して上記の方法を変更しました。

public void paintComponent(Graphics g) {
        String path = "Bgnd11.jpg";
        java.net.URL imgURL = getClass().getResource(path);     
        Image img = new ImageIcon(imgURL).getImage();
        Dimension size = new Dimension(img.getWidth(observer), img.getHeight(observer));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
        g.drawImage(img, 0, 0, null);
}

以下に示すように、ボタンの作成に必要な画像を取得してボタンに渡そうとしましたが、うまくいきませんでした。

String path = "Bgnd11.jpg";
java.net.URL imgURL = getClass().getResource(path);     
Image img = new ImageIcon(imgURL).getImage();

画像を見つけてロードする方法は?

4

1 に答える 1

6

最初の試みでは、現在のディレクトリにあるファイル システムからイメージをロードしています。このディレクトリは、javaofjavawコマンドが開始されたディレクトリです。これが、アプリケーションにイメージをバンドルできない理由です。明らかに、アプリのエンド ユーザーの現在のディレクトリには画像がありません。現在のディレクトリは、アプリケーションの起動方法によって異なります。

代わりに、イメージを jar ファイル内にパッケージ化してクラスパスに存在させ、2 回目の試行で行っているように ClassLoader を使用してイメージをロードする必要があります。

それらが jar のフォルダーにあるとしましょう。/resources/imagesしたがって、これは package に対応しますresources.images

を使用すると、javadoc が示すように、によって返されるクラスと同じパッケージ内でgetClass().getResource("Bgnd11.jpg")検索を試みます。したがって、クラスが package にある場合、この例では機能します。そうでない場合は、リソースの絶対パスを使用する必要があります。Bgnd11.jpggetClass()resources.images

URL imgURL = getClass().getResource("/resources/images/Bgnd11.jpg");   

また、bin フォルダーを台無しにしないでください。これは Eclipse の宛先フォルダーであり、クリーン ビルドを実行すると、このディレクトリーからすべてが削除されます。イメージをソース ディレクトリの適切なパッケージに追加するだけで、プロジェクトのビルド時に Eclipse がイメージを宛先ディレクトリに自動的にコピーします。

于 2013-05-10T16:46:19.613 に答える