Java:JPanel 背景不缩放

标签 java image components

我正在尝试用 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 值设置为该值,从而完全从显示中删除该图像。

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

最佳答案

我想“最简单”的方法是做类似的事情......

@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 方法中重复缩放图像,这可能会经常被捕获...<​​/p>

已更新工作示例

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

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

}

关于Java:JPanel 背景不缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19648833/

相关文章:

php - 我应该安装 Imagemagick 还是 gd

css - 按钮悬停图像在 CSS 中不起作用

javascript - React,根据父组件和两个子组件之间的通信有条件地渲染组件

c# - 找不到引用组件 Microsoft.CSharp

java - 自动变量赋值?

java - 如何将 Garcia 的 WebDriverManager 与 Spring 的 Request 结合使用?

java - Java中使用参数实例化变量

python - PyQt:将缩放图像放在标签的中心

java - 使用静态关键字

delphi - 哪些积极开发的 Delphi 组件仍然支持 Kylix?