繁体   English   中英

在窗口上调整ImageIcon的大小

[英]Resize ImageIcon on window Resize

这已经困扰了我一段时间,但我似乎无法弄清楚我在做什么错。 所以我用图像图标设置了面板的背景,但是当我调整窗口大小时,它使BG保持相同的大小,并且我在裸露的边缘得到了这堵巨大的白墙,我想将bg拉伸为窗口变化

这是我的相关代码

    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);
                }
*/
            }
        });

问题是,为什么要(调整大小)? 您仅告诉Graphics上下文它应该在组件的左上角(0x0)绘制图像。

您应该看看Graphics#drawImage(Image, int, int, int, int, ImageObserver)Graphics2D#drawImage(Image, AffineTransform, ImageObserver)

您还应该看看:

用于讨论缩放图像的不同方法

您还打破了油漆链,这导致了“白墙”。 在执行任何自定义绘制之前,您应该调用super.paintComponent

当出于自定义绘画的目的而覆盖诸如JPanelJComponent类的容器时,您还应该考虑覆盖getPreferredSize方法,这将为布局管理器提供一种将组件调整为适当的默认大小的方法,而不是使用通常为默认值的0x0尺寸。

您可以将侦听器添加到面板中...

如何强制将ImageIcon设置为特定大小?

按钮上有解决方案,但是您可以非常轻松地了解这些组件...

(复制粘贴)

那么如何测量按钮的尺寸呢?

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM