2017-03-25 8 views
0

以下の短いピースコードが機能しない理由を理解しようとしています。 レイアウトがない場合、またはコンポーネントのサイズが0の場合、ペイントコンポーネントメソッドは呼び出されません。JPanelのsetPreferredSizeにもかかわらず、PaintComponent()が呼び出されていない

ただし、ここには該当しません。

理由を説明できない理由を説明できますか?より

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(bgImage, 0, 0, this); 
} 

paintComponent ...のようなものに

public class Login extends JPanel { 

    private BufferedImage bgImage; 

    public Login() { 
     super(); 
     initImages(); 
     setLayout(new BorderLayout()); 

     setPreferredSize(new Dimension(600, 600)); 
     add(new JLabel("Hi"), BorderLayout.CENTER); 
    } 

    private void initImages() { 
     try { 
      bgImage = ImageIO.read(new File("images/login.jpg")); 
      System.out.println("image loaded"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.out.println("image not loaded"); 
     } 
    } 

    @Override 
    public void paintComponents(Graphics g) { 
     super.paintComponents(g); 
     g.drawImage(bgImage, 0, 0, null); 
     System.out.println("repaint"); 
    } 

    public static void createAndShowGui() { 
     JFrame frame = new JFrame(); 
     Login login = new Login(); 
     frame.add(login, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 
+0

'paintComponents'は'paintComponent'である – MadProgrammer

+0

' paintComponent'を 'paintComponent'に変更しました。それはうまく動作します - ' paintComponent'が何をするのか理解しています。 'super'メソッドを呼び出す前にペイントしようとするとペイントは削除されます。 – MadProgrammer

+0

うわー、paintComponentはpaintComponentと違います。 なので、paint、paintComponents、paintComponent ..あなたは答えとしてあなたのコメントを投稿してください。私はあなたを選ぶでしょう。ありがとうございました。 – zcahfg2

答えて

1

あなたはこれが仕事をしたい場合は、あなたが変更する必要がありますが...

@Override 
public void paintComponents(Graphics g) { 
    super.paintComponents(g); 
    g.drawImage(bgImage, 0, 0, null); 
    System.out.println("repaint"); 
} 

は塗装のために責任がありますコンポーネントの「ボトム」レイヤー、paintComponentsは子供のペインティングを担当します

+0

あなたのソリューションをありがとう。いくつかの研究の結果、paintComponentメソッドの中にイメージをロードすることは理想的ではないことがわかりました。このメソッドは繰り返し呼び出され(何度か連続して)、リソースが不必要に消費されます。背景画像を読み込むためのより良いアプローチはありますか? – zcahfg2

+1

あなたが基本的にやっていることは、コンストラクターでロードする正しいアプローチです – MadProgrammer

関連する問題