2016-11-20 9 views
0
public class bioscope extends Component{ 

static int width; 
static int height; 

public void paint(Graphics g){ 
    try { 
     BufferedImage crow = ImageIO.read(new File("photos/houseCrow.jpg")); 
     this.width = crow.getWidth(); 
     this.height = crow.getHeight(); 
     System.out.println(this.height);  
     System.out.println(this.width); 
     g.drawImage(crow, 0, 0, null); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
public static void main(String[] args) { 
    JFrame frame = new JFrame("Bioscope: Have a peek!"); 
    frame.getContentPane().add(new bioscope()); 
    frame.setVisible(true); 
    frame.setSize(bioscope.width, bioscope.height); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //frame.setResizable(false); 
    System.out.println(bioscope.height); 
    System.out.println(bioscope.width); 
} 
} 

出力ウィンドウの高さと幅はゼロですが、これはイライラしていますが、まだ解明できるようです。何が私を驚かせるのはprintlnコマンドの出力です。私はこれが4行目の出力であると予想しました:492,640,492,640。しかし、まず0,0を印刷し、明らかに停止します。しかし、全画面表示され、492,640がプリントアウトに追加されます!今あなたが知っているのは、全画面表示になるたびにprintlnを呼び出し、492,640が追加されます。 JFrameウィンドウを最小化またはサイズ変更しようとすると、同様の追加が発生します。JFrame寸法の問題

なぜこのようなことが起こり、JFrameウィンドウの最初のサイズが492,640でないのはなぜですか?画像は正常に添付されましたが、ウィンドウのサイズを変更した場合に表示されるようになりました。

+0

は、なぜあなたは '期待します492,640,492,640'?これらの値はどこにありますか? –

+0

492,640はもちろん、私のJFrameウィンドウに追加する画像の高さと幅です。申し訳ありませんが私の質問は少し前に不完全に見えたので、私は投稿を完了しましたが、ドラフトが何らかの奇妙な理由で部分的にのみ保存されるとは想像できませんでした。 –

答えて

1

は、私はあなただけのデバッグのためにそれらを使用している場合、あなたの2つの静的フィールド高さは、コンポーネントの実際の寸法上の任意の効果を持つことを期待し、かかはわかりません。 widthheightのフィールドがComponentにあると宣言した静的フィールド。スーパークラスで使用される実際の値を追跡するには、getWidth()getHeight()を使用する方が適切です。

静的フィールドが最初の塗りつぶしまで初期化されていないため、0, 0が最初に印刷されます。 paintメソッドは、フレームが再描画されたときにのみ呼び出されるため、ウィンドウのサイズを変更するたびにログ行が表示されます。

これを試してみてください:

public class bioscope extends JComponent { 
    transient BufferedImage crow; 

    public bioscope() { 
     try { 
      crow = ImageIO.read(new File("photos/houseCrow.jpg")); 
     } catch (IOException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
     setPreferredSize(new Dimension(crow.getWidth(), crow.getHeight())); 
    } 

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

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Bioscope: Have a peek!"); 
     bioscope bioscope = new bioscope(); 
     frame.getContentPane().add(bioscope); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setResizable(false); 
    } 
}