2014-09-22 2 views
0

Это меня раздражало какое-то время, но я просто не могу понять, что я делаю неправильно. Поэтому я устанавливаю фон панели с изображением Icon, но когда я изменяю размер окна, он оставляет BG одного размера, и я получаю эту огромную белую стену вокруг открытого края, я бы хотел растянуть bg как окно измененияResize ImageIcon on window Resize

вот мой соответствующий код

protected JPanel createRightPane() { 
     final ImageIcon BGiconSM = ScaledImageIcon("parchmentTall.jpg", "BG Plate", initalWidth/2, initalHeight); 
     final ImageIcon iconSM = ScaledImageIcon("titlebar.png", "Title Bar BG", (initalWidth/3), 40); 
     //TODO Parchment image resize 
     final JPanel content = new JPanel(new GridBagLayout()); 
     content.setOpaque(false); 

     final JPanel panel = new JPanel(new BorderLayout())       { 
      protected void paintComponent(Graphics g) 
      { 
       // Dispaly image at full size 
       Image BGicon = BGiconSM.getImage();     
       g.drawImage(BGicon, 0, 0, null); 
       super.paintComponent(g); 
      } 
     }; 
     panel.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e){ 
       Rectangle r = frame.getBounds(); 
       int h = r.height; 
       int w = r.width; 
       if (h >= initalHeight){h = initalHeight-30;}      
       //System.out.println(h); 
       //System.out.println(w); 
/*     protected paintComponent(Graphics g) 
       { 
        // Dispaly image at full size 
        Image BGicon = BGiconSM.getImage();     
        g.drawImage(BGicon, 0, 0, null); 
        super.paintComponent(g); 
       } 
*/ 
      } 
     }); 

ответ

1

вы можете добавить слушателя на панель ...

How can I force an ImageIcon to be a certain size?

есть решение на кнопку, но вы можете очень легко Excahnge эти компоненты ...

(копировать/вставить)

поэтому как измерить размер кнопок?

final JPanel panel = new JPanel(); //create it on your custom way... 
panel.addComponentListener(new ComponentAdapter() { 

    @Override 
    public void componentResized(ComponentEvent e){ 
     int w = b.getWidth(); 
     int h = b.getHeight();    
     setIconSize(w,h); //TODO by yourself (sorry, if more help required please say so) 
    } 
}); 

вы можете просто масштабировать изображение с этим кодом:

/** 
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. 
* Resizes an image using a Graphics2D object backed by a BufferedImage. 
* @param srcImg - source image to scale 
* @param w - desired width 
* @param h - desired height 
* @return - the new resized image 
*/ 
private Image getScaledImage(Image srcImg, int w, int h){ 
    BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g2 = resizedImg.createGraphics(); 
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    g2.drawImage(srcImg, 0, 0, w, h, null); 
    g2.dispose();   
    return resizedImg; 
} 
+1

Единственная проблема, с которой я столкнулся бы с этим решением: «componentReiszed» может быть вызван несколько раз подряд, изменение размера не может быть достаточно интенсивным. Я мог бы подумать о том, что изображение с низким качеством, которое можно быстро изменить и нарисовать, и настроить Swing 'Timer' (установленный примерно на 125-250 миллисекунд), который перезапускается каждый раз« componentResized », это означает, что после (около) 125 мс после последнего вызова «componentResized» Я могу выполнить «качество» изменения размера за один шаг и перекрасить компонент, но это только я;) – MadProgrammer

+0

да, очень правильно! я не могу найти лучший способ !!! –

+0

Спасибо Мартину, который заставил меня на правильном пути, ультимативно я возился с ним и получил его на 90%, за исключением одного, я мог найти размер и установить его на изображение, но когда я попытался вызвать компонент краски внутри размера компонент, который сломал Eclise, дает мне ошибку на фигурных скобках, означающую, что он не переконфигурирует конец вспомогательной функции, означающей, что что-то должно быть неправильно в моих функциональных вызовах, обновит OP кодом – NekoLLX

3

вопрос в том, почему он (размер)? Вы только сказали контексту Graphics, что он должен нарисовать изображение в верхнем левом углу компонента (0x0).

Вы должны взглянуть на Graphics#drawImage(Image, int, int, int, int, ImageObserver) и Graphics2D#drawImage(Image, AffineTransform, ImageObserver)

Вы должны также взглянуть на:

обсуждения по различные подходы к масштабированию изображений

Вы также нарушаете цепочку окраски, которая вызывает «стену белого цвета». Вы должны позвонить super.paintComponent перед выполнением любой пользовательской картины.

Когда перекрывая контейнер, как JPanel или JComponent для целей таможенной живописи, вы должны также рассмотреть вопрос о переопределении метода getPreferredSize, это обеспечит средства для менеджеров компоновки к размеру компоненты до нужного размера по умолчанию, вместо использования 0x0 который обычно является размером по умолчанию.

+0

вау - я всегда впечатлены, как быстро и точно вы в состоянии ответить! Я добавил свое решение, чтобы показать, как добавить компонентListener –

+1

@MartinFrank. Я думаю, что у этого парня есть крючок в Stack Overflow, который передает ему вопросы за 30 минут до того, как все остальные получат их. Только объяснение этого странного поведения: -D –

+0

hahaha - я рад, что я не единственный, кто понял, что ^^ ... но на самом деле - я очень рад, что здесь такие амбициозные люди! –