2016-05-26 10 views
1

Swingの一般的なcostumersには簡単な問題があります。JPanel内にJComponentが描画されない

アイデアは、画像をロードしてJComponentオブジェクトを介してJPanelの背景として使用することです。 toString()メソッドの画像情報が正しくロードされていて、paintComponent()メソッドが実行中ですが、何らかの理由でJFrameの内部でレンダリングが正しく行われていないため、空のフレームが表示されるため、正常にロードされているようです。ここでは、コードです:

RicochetFrame.java

public class RicochetFrame extends JFrame { 
    RicochetStartPanel startPanel; 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       RicochetFrame window = new RicochetFrame(); 
       window.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    } 

    public RicochetFrame() throws IOException { 
    startPanel = new RicochetStartPanel(); 

    this.getContentPane().add(startPanel); 

    this.setBounds(0, 0, 500, 500); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //this.pack(); 
    this.setVisible(true); 
    } 

} 

RicochetStartPanel.java

public class RicochetStartPanel extends JPanel { 
    RicochetStartPanel() throws IOException { 
    BufferedImage myImage = ImageIO.read(new File("frame_bg.jpg")); 
    this.add(new RicochetImagePanel(myImage)); 

    this.setVisible(true); 

    this.validate(); 
    this.repaint(); 
    } 

} 

RicochetImagePanel.Java

public class RicochetImagePanel extends JComponent { 
    private Image image; 

    public RicochetImagePanel(Image image) { 
    this.setVisible(true); 

    this.image = image; 
    } 
    @Override 
    protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(image, 0, 0, this); 
    } 
} 
+0

'BufferedImage myImage = ImageIO.read(new File(" frame_bg.jpg "));'アプリケーションリソースはデプロイメント時に埋め込まれたリソースになるので、今のようにアクセスすることをお勧めします。 [タグ:埋め込みリソース]は、ファイルではなくURLでアクセスする必要があります。 [info。埋め込みリソースのページ](http://stackoverflow.com/tags/embedded-resource/info)を参照してください。 –

答えて

2

あなたのRicochetImagePanelは、その好ましいサイズ=> [0、0]にサイジングしています。 getPreferredSize()をオーバーライドしてイメージのサイズを返します(nullでない場合)。なぜなら、画像を単にImageIconとしてJLabelに表示するのはなぜですか?

関連する問題