0

4 つの異なるパネルを持つ JFrame があります。下の画像の右側にある黒いボックスが画像パネルです。プログラム内の他のクラス内の任意のパネルに画像をロードできるようにするクラスを作成しようとしています。

http://sdrv.ms/14TEq2T

LoadImage.java

package sf;

import java.awt.*;
import java.awt.image.*;
import javax.swing.ImageIcon;

public class LoadImage extends Component {

BufferedImage img;

public void paint(Graphics g) {
    g.drawImage(img, 0, 0, null);
}

public LoadImage(String filename) {
   try {         
       System.out.println(filename);
       img = new ImgUtils().scaleImage(380, 360, filename);           
   } catch (Exception e) {
       System.out.println("File not found");
   }

}

class ImgUtils {

    public BufferedImage scaleImage(int WIDTH, int HEIGHT, String filename) {
        BufferedImage bi = null;

        try {
            ImageIcon ii = new ImageIcon(filename);
            bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = (Graphics2D) bi.createGraphics();
            g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
            g2d.drawImage(ii.getImage(), 0, 0, WIDTH, HEIGHT, null);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        return bi;
    }
}
}

他のクラスでイメージをロードするために使用するコード。

private void getProductImage() {

    try {
        String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
        String decodedPath = URLDecoder.decode(path, "UTF-8");
        String newPath = decodedPath.replace("build/classes/", "src/productImages/");

        productImagePanel.add(new LoadImage(newPath + imageCode + ".jpg"));
        revalidate();
        pack();


    } catch (Exception e) {
        e.printStackTrace();
    }
}

「imageCode」は、ウィンドウが表示されるとデータベースから取得されるコードであり、画像へのパスを数回確認しました。

LoadImage.java は単独で動作し、「メインの実行可能な」メソッドが追加されている場合は画像をロードしますが、必要なパネルに画像を表示できないようです。私の問題を解決する方法についてアドバイスをお願いします。

4

1 に答える 1

4

問題は、イメージをコンポーネントとして JPanel にロードしようとしている可能性があります。問題は次のとおりです。

  • Component の preferredSize は [0, 0] である可能性が高いため、画像を表示するのは少し面倒ですが、小さすぎて表示できません。
  • JPanel にすでに他のコンポーネントが追加されている可能性があります。
  • JPanel のレイアウトは、新しく追加されたコンポーネントでは適切に機能しない場合があります。
  • 明確な必要性がない限り、重い (コンポーネント) と軽量 (他のほとんどすべてのトップ レベル以外の Window Swing コンポーネント) を混在させるべきではありません。

私は提案します:

  • JPanel の作成時に一度だけ JPanel を表示するイメージに JLabel を追加します。
  • image または ImageIcon を受け入れるメソッドを productImagePanel に与え、Image から ImageIcon を作成するか、提供された ImageIcon を使用して JLabel の Icon を設定します。
  • JPanel が、JLabel 自体を完全に表示できるレイアウトを使用していることを確認してください。これには、レイアウト マネージャーのチュートリアルが役立ちます。
  • JPanel を表示するそれまたはすべての画像は、画像のみを表示し、それを取り除き、代わりに JLabel を単独で使用し、アイコンを直接追加することです。

また、余談ですが、作成した Graphics および Graphics2D オブジェクトは破棄する必要があります(ただし、JVM から提供されたものは破棄しません)。つまり、ImageUtilities で g2d を使用して描画を終了したら、それを破棄します。

于 2013-06-26T16:53:07.277 に答える