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
的新图像,并将img
的getScaledInstance
值设置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); } } }