- 締切済み
javaで画像を表示したのですが、変です。
画像をのせたのですが、表示した画像の透明部分のところに予期しない形で画像が重なってしまいます。 また、ウィンドウのサイズを何回かスクロールしていじると元に戻ります。 文字数の関係ですべてのソースを乗せられないのですが、自作画像クラスだけ記載します。 import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; public class Layer extends JPanel { BufferedImage image; int x=0,y=0; //表示サイズ int lx=0,ly=0; //表示場所 int originalX,originalY; int startX,startY; Layer(){ } public void p(String imgpath,int lX,int lY,int X,int Y){ x=X;y=Y;lx=lX;ly=lY; image=Imagedraw(imgpath); } public void p(String imgpath,int lX,int lY){ lx=lX;ly=lY; image=Imagedraw(imgpath); x=originalX; y=originalY; setSize(x,y); } public void p(String imgpath){ image=Imagedraw(imgpath); x=originalX; y=originalY; setSize(x,y); } public BufferedImage Imagedraw(String imgpath){ BufferedImage img=null; try{ img = readImage(imgpath); }catch(Exception e){ e.printStackTrace(); } setLocation(lx,ly); setSize(x,y); return img; } public void setLocation(int lX, int lY){ lx=lX;ly=lY; super.setLocation(lx,ly); } public void paint(Graphics g){ //イメージを描画 g.drawImage(image,0,0,x,y,startX,startY,x+startX,y+startY,this); } public BufferedImage readImage(String path) throws IOException{ BufferedImage img; img = ImageIO.read(new File(path)); originalX=img.getWidth(); originalY=img.getHeight(); return img; } } どなたか原因に心当たりのある方、よろしくお願いいたします。 なお、画像はインターネット上での拾いものです。書かれた方には感謝いたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- mpro-gram
- ベストアンサー率74% (170/228)
swingのお作法に則ってないせいでしょう。 paint() メソッドではなく、paintComponent(Graphics g) を上書きするとか、 paintComponent()の一番最初に super.paintComponent(g) を実行して、背景初期化を行うようにしないと、ゴミが消せません。 参考 http://homepage1.nifty.com/algafield/JavaGUIFaq19j.html#eight2 「JPanelの上で描画をすると、背景がごみになります。」 このページの直ぐ上に、背景を透明にするなら、javax.swing.JComponentを使うのが良いとありますよ。 あと、javax.swing.JFrameで表示してるのだろうけど JFrameでは、コンテントペインにJPanelなどのコンポーネントを配置するとか、 setVisible(true) の前に pack() で内部コンポーネントのサイズ計算しておくなどしないと、初期表示の時には、JPanelのサイズが 0,0 で表示されてしまったりします。