Java 调整图像大小窗口上的图标调整大小

Java 调整图像大小窗口上的图标调整大小,java,swing,paintcomponent,imageicon,Java,Swing,Paintcomponent,Imageicon,这件事困扰了我一段时间,但我似乎不知道我做错了什么。因此,我设置了一个带有图像图标的窗格的背景,但当我调整窗口大小时,它会使背景保持相同的大小,并且在暴露的边缘周围有一个巨大的白色墙,我想随着窗口的变化拉伸背景 这是我的相关代码 protected JPanel createRightPane() { final ImageIcon BGiconSM = ScaledImageIcon("parchmentTall.jpg", "BG Plate", initalWidt

这件事困扰了我一段时间,但我似乎不知道我做错了什么。因此,我设置了一个带有图像图标的窗格的背景,但当我调整窗口大小时,它会使背景保持相同的大小,并且在暴露的边缘周围有一个巨大的白色墙,我想随着窗口的变化拉伸背景

这是我的相关代码

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

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

你应该看一看

您还应该看看:

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

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


当重写一个容器,如<代码> jPuth<代码>或<代码> jCube >为自定义绘制的目的时,您还应该考虑重写<代码> GETAPYRESD Stime方法,这将为布局管理器提供将组件大小调整为适当默认大小的方法,而不是使用通常为默认大小的
0x0

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

你应该看一看

您还应该看看:

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

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


当重写一个容器,如<代码> jPuth<代码>或<代码> jCube >为自定义绘制的目的时,您还应该考虑重写<代码> GETAPYRESD Stime方法,这将为布局管理器提供将组件大小设置为适当默认大小的方法,而不是使用通常为默认大小的
0x0

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

有一个按钮上的解决方案,但你可以很容易地更换这些组件

(复制/粘贴)

那么如何测量纽扣的尺寸呢

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

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

有一个按钮上的解决方案,但你可以很容易地更换这些组件

(复制/粘贴)

那么如何测量纽扣的尺寸呢

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


哇-我一直对你的回答速度和准确度印象深刻!我添加解决方案只是为了演示如何添加componentListener@MartinFrank我认为这家伙在Stack Overflow有一个联谊会,在其他人得到问题前30分钟向他提问。对这种奇怪行为的唯一解释:-哈哈-我很高兴我不是唯一一个意识到^^^。。。但真的-我很高兴这里有如此雄心勃勃的人@疯狂的程序员当你做你喜欢的事情时,你怎么会感到无聊呢@peeskillet这是因为我在一家公司工作,他毫不犹豫地忽略了30多年来的用户界面设计原则和心理学、用户体验指导原则以及几乎所有主要的软件开发范例……过了一段时间,你就有点恼火了……哇——我总是对你能够回答的速度和准确度印象深刻!我添加解决方案只是为了演示如何添加componentListener@MartinFrank我认为这家伙在Stack Overflow有一个联谊会,在其他人得到问题前30分钟向他提问。对这种奇怪行为的唯一解释:-哈哈-我很高兴我不是唯一一个意识到^^^。。。但真的-我很高兴这里有如此雄心勃勃的人@疯狂的程序员当你做你喜欢的事情时,你怎么会感到无聊呢@peeskillet那是因为我在一家公司工作,他毫不犹豫地忽略了30多年的用户界面设计原则和心理学,用户体验指南和几乎所有主要的软件开发范例……过了一段时间后,您会感到有些困惑……这个解决方案唯一的问题是组件重新发布了,可能会连续多次调用,调整大小不会太费力。我可能会考虑有一个“低质量”的图像,它可以快速调整大小并绘制,并有一个Swing <代码>定时器< /Case>安装(设置为125-250毫秒),每次重新启动“代码>组件大小,这意味着在最后一次调用<代码> 125毫秒之后,组件大小< /代码>我可以执行“质量”。一步调整大小并重新绘制组件-但这只是我;)感谢Martin让我走上了正确的道路,最后我对它进行了修补,并使它90%正常工作,除了一件事,我可以找到大小并将其设置为图像,但当我试图调用resize组件内的paint组件时,它断开了Eclise,这在cury括号上给了我一个错误,意味着它无法重新识别子函数的结尾,意味着我的函数调用中一定有错误,将使用代码更新OP。我很高兴我能提供帮助,但也许你有时会考虑看看那些来自McDealther-Studio的提示——这真的值得考虑^ ^但是对我来说,我很高兴能帮你一点忙,祝你的项目好运!!!我确实看了提示,问题不在于代码,因为它是我初始图像绘制的复制粘贴,我很确定这是一个语法错误,一个放错了位置的simicolor或parem,但不确定是哪个,因为我知道实际的可执行代码可以工作,我只是看不到语法错误。这个解决方案唯一的问题是
componentreised
可能会被快速连续调用多次,调整大小不太容易