Java:JPanel背景不缩放

我正在尝试在java中为一个JPanel画一个图像,我有这个,很好。 我现在的问题是我正在试图使它扩大到窗口的全尺寸,但它并没有这样做。 我已经尝试过方法,它们要么使图像消失,要么完全没有graphics变化。

我目前正在使用的代码是:

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

全class在: http : //pastebin.com/CpcBt2j8

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

我怎样才能把图像缩放到我想要的全尺寸?

要dynamic缩放您使用的图像:

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

请参阅背景面板以获得完整的实现以及平铺function。

我猜“最简单”的做法是做一些像…

 @Override public void paintComponent(Graphics g) { super.paintComponent(g); Image scaled = img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH); g.drawImage(scaled, 0, 0, null); } 

这是效率低下,成本高昂,可能不会产生预期的结果

首先,看看Image.getScaledInstance()的风险。

您还可以看看Java:保持JPanel背景图像的纵横比,以获取更多关于维护图像纵横比和比例尺以适应vs比例填充的细节。

我也会缓冲结果,所以你不反复缩放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); } } }