2016-11-20 3 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. Я ожидал, что это будет четыре строки: 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

Я не уверен, если вы ожидаете ваши два статических поля ширина и высота иметь никакого влияния на фактические размеры компонента, или если вы просто использовать их для отладки. Статические поля, которые вы указали, затеняют width и height полями в 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); 
    } 
}