2

パネルに画像を背景として表示させようとしています。すでにNetBeansでそれを行うことができますが、jarを作成して実行すると、画像が表示されません。別の方法でアクセスする必要があることはわかっています。私は多くのチュートリアルを見てきましたが、それらのすべてがImageIconでそれを行う方法を示していますが、私はそれを必要とせず、Imageだけが必要です。これを行うために必要なコードを誰かが指摘できますか?ありがとう。

これは、バックグラウンドのJPanelのコードです。

public class JPanelWB extends JPanel { // Creates JPanel with given image as background.

    private Image backgroundImage;

    public JPanelWB(String fileName){
        try {
            backgroundImage = ImageIO.read(new File(fileName));
        } catch (IOException ex) {
            new JDialog().add(new Label("Could not open image."+ex.getMessage()));
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Draw the background image.
        g.drawImage(backgroundImage, 0, 0, getWidth(),getHeight(),this);
    }
}
4

2 に答える 2

1

ええ、あなたは画像をファイルとして読み込もうとしています-ファイルはJarファイル内に存在しないのでそうしないでください。代わりに、リソースとして読み込んでください。

そのようなもの:

public JPanelWB(String resourceName){
   try {
       // backgroundImage = ImageIO.read(new File(resourceName));
      backgroundImage = ImageIO.read(getClass().getResource(resourceName));
   } catch (IOException ex) {
       new JDialog().add(new Label("Could not open image."+ex.getMessage()));
   }
}

ただし、リソースパスはファイルパスとは異なることに注意してください。リソースパスは、クラスファイルの場所を基準にしています。

于 2012-05-09T16:20:13.270 に答える
0

新しい画像を読んで背景としてインポートしたい場合は、私より賢い人がすでにあなたの質問に答えています。

しかし、あなたの問題が私のものと似ている場合、これは助けになるかもしれません:

表示する画像がすでにある場合は、絶対パスからそれらを呼び出すことが重要です。実行可能クラスフォームJARは、コンピューターの物理ドライブではなく、仮想マシン内で作成されたドライブを読み取ります。

次のような短いパスのフォルダに画像を配置します

C:\ J \ proj \ img \

のような絶対パスでそれらを呼び出します

"C:\\ J \\ proj \\ img \\ your_image.png" //(二重の円記号を忘れないでください。)

(パスの長さを気にしない場合は、プロジェクトパッケージ内のイメージフォルダーに残し、そこから呼び出します。)

NetBeansは、それらを絶対パスでJARにパックします。実行時に、JREはそのパスを含むJVMを作成し、JARからイメージを取得して、その仮想パスに配置します。クラスは、物理ドライブからパスを読み取るのではなく、JVM内に新しく作成された独自の仮想ドライブからパスを読み取るため、それらを見つけることができます。

その場合、ImageIconを回避することは、より煩雑であり、少なくはありません。

次のように、JLabelとして「blackBoard」をJFrameの背景として追加し、そのレイアウトをnullに設定できます。

    private JLabel blackBoard;
    private JLabel noteToSelf;
    //.....
    blackBoard = new JLabel();
    noteToSelf = new JLabel();
    //.....

    // putting JLabel "blackBoard" as background into JFrame
    blackBoard.setIcon(new ImageIcon("c:\\Java\\images\\MarbleTable.png"));
    getContentPane().add(blackBoard);
    blackBoard.setBounds(1, 1, 400, 440);
    blackBoard.setLayout(null);

次に、このように、JFrameではなく「blackBoard」にコンポーネントを追加します。

    // putting JLabel "noteToSelf" onto background
    noteToSelf.setIcon(new ImageIcon("c:\\Java\\images\\Sticker_a1.png"));
    // or:  noteToSelf.setText("Remind me at 6:30am...");
    blackBoard.add(noteToSelf);
    noteToSelf.setBounds(noteX, noteY, 64, 48);

これで、JFrameはテーブルボードになり、「blackBoard」はその上のテーブルシートになります。

お役に立てれば。

于 2017-10-08T19:53:14.303 に答える