Java:JPanel 背景不缩放

Posted

技术标签:

【中文标题】Java:JPanel 背景不缩放【英文标题】:Java: JPanel background not scaling 【发布时间】:2013-11-08 01:17:36 【问题描述】:

我正在尝试在 java 中将图像绘制到 JPanel 中,但我已经完成了,很好。我现在的问题是我正在尝试使其缩放到窗口的全尺寸,但它没有这样做。我尝试了一些方法,它们要么使图像消失,要么根本没有图形变化。

我目前正在使用的代码:

class ImagePanel extends JPanel 
    private static final long serialVersionUID = 1L;

    private Image img;

    public ImagePanel(String img) 
        this(new ImageIcon(img).getImage());
    

    public ImagePanel(Image img) 
        this.img = img;
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
    

    public void paintComponent(Graphics g) 
        g.drawImage(img, 0, 0, null);
    

完整课程:http://pastebin.com/CpcBt2j8

我尝试在img = img.getScaledInstance(440, 440, Image.SCALE_SMOOTH) 处添加代码,但没有任何效果。我还尝试制作一个名为scaledImg 的新图像并将imggetScaledInstance 值设置为该值,这会完全从显示中删除图像。

如何将图像缩放到我想要的完整尺寸?

【问题讨论】:

【参考方案1】:

动态缩放您使用的图像:

//g.drawImage(img, 0, 0, null);
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);

请参阅Background Panel 了解完整的实现以及平铺功能。

【讨论】:

【参考方案2】:

我猜“最简单”的方法是做类似...

@Override
public void paintComponent(Graphics g) 

    super.paintComponent(g);
    Image scaled = img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
    g.drawImage(scaled, 0, 0, null);


这是低效、昂贵的,并且可能不会产生预期的结果

首先,看看The Perils of Image.getScaledInstance()

您还可以查看Java: maintaining aspect ratio of JPanel background image,了解有关保持图像纵横比和缩放以适应与缩放以填充的更多详细信息。

我还会缓冲结果,这样您就不会在 paintComponent 方法中重复缩放图像,这可能会经常被捕获...

更新了工作示例

这对我来说很好......

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.HeadlessException;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestImagePane 

    public static void main(String[] args) 
        new TestImagePane();
    

    public TestImagePane() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) 
                

                try 
                    Image img = null;
                    img = ImageIO.read(new File("/path/to/image"));

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new ImagePanel(img));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                 catch (IOException | HeadlessException exp) 
                    exp.printStackTrace();
                
            
        );
    

    class ImagePanel extends JPanel 

        private static final long serialVersionUID = 1L;

        private Image img;
        private Image scaled;

        public ImagePanel(String img) 
            this(new ImageIcon(img).getImage());
        

        public ImagePanel(Image img) 
            this.img = img;
        

        @Override
        public void invalidate() 
            super.invalidate();
            int width = getWidth();
            int height = getHeight();

            if (width > 0 && height > 0) 
                scaled = img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
            
        

        @Override
        public Dimension getPreferredSize() 
            return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(this), img.getHeight(this));
        

        @Override
        public void paintComponent(Graphics g) 
            super.paintComponent(g);
            g.drawImage(scaled, 0, 0, null);
        
    


【讨论】:

这根本不会产生结果,正如我所说的,我已经尝试过了。图形被完全删除。 你说的“图形被完全删除”是什么意思?除了你没有打电话给super.paintComponent 对不起,我没有放下我的意思。我的意思是,绘制的图像已完全从视图中移除,它只是离开了面板。

以上是关于Java:JPanel 背景不缩放的主要内容,如果未能解决你的问题,请参考以下文章

屏幕上鼠标位置周围区域的缩放框[关闭]

UIView 背景图像在设备旋转时不缩放

css zoom缩放带有背景图片的元素的时候发现会吃掉1px或2px导致背景图片显示不全,请问怎么解决

100%缩放背景图像(不保留纵横比)

缩放背景图像以包装布局内容

java swing 我是想把图片作为登录界面的背景,并且需要背景图片能够随窗口大小缩放。。。最好是用标签法