在调整应用程序窗口大小时,如何在应用程序内调整图像大小?

当我最大化我的应用程序时,JPanel内部的图像不会随之resize。 当窗口最大化时,如何调整JPanel及其内容?

编辑:我正在使用BufferedImage

那是一个开放式的问题。

你想缩放以填充或缩放以适应该区域或者你不关心纵横比吗?

缩放到填充和缩放之间的差异

在此处输入图像描述在此处输入图像描述

此示例将对帧大小的变化做出反应,并实时重新缩放图像。

public class TestScaling { public static void main(String[] args) { new TestScaling(); } public TestScaling() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new ScalingPane()); frame.setSize(200, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class ScalingPane extends javax.swing.JPanel { private BufferedImage image; public ScalingPane() { try { image = ImageIO.read(getClass().getResource("/AtDesk.png")); } catch (IOException ex) { ex.printStackTrace(); } setBackground(Color.red); } public double getScaleFactor(int iMasterSize, int iTargetSize) { double dScale = 1; dScale = (double) iTargetSize / (double) iMasterSize; return dScale; } public double getScaleFactorToFit(Dimension original, Dimension toFit) { double dScale = 1d; if (original != null && toFit != null) { double dScaleWidth = getScaleFactor(original.width, toFit.width); double dScaleHeight = getScaleFactor(original.height, toFit.height); dScale = Math.min(dScaleHeight, dScaleWidth); } return dScale; } public double getScaleFactorToFill(Dimension masterSize, Dimension targetSize) { double dScaleWidth = getScaleFactor(masterSize.width, targetSize.width); double dScaleHeight = getScaleFactor(masterSize.height, targetSize.height); double dScale = Math.max(dScaleHeight, dScaleWidth); return dScale; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); double scaleFactor = Math.min(1d, getScaleFactorToFit(new Dimension(image.getWidth(), image.getHeight()), getSize())); // double scaleFactor = Math.min(1d, getScaleFactorToFill(new Dimension(image.getWidth(), image.getHeight()), getSize())); int scaleWidth = (int) Math.round(image.getWidth() * scaleFactor); int scaleHeight = (int) Math.round(image.getHeight() * scaleFactor); Image scaled = image.getScaledInstance(scaleWidth, scaleHeight, Image.SCALE_SMOOTH); int width = getWidth() - 1; int height = getHeight() - 1; int x = (width - scaled.getWidth(this)) / 2; int y = (height - scaled.getHeight(this)) / 2; g.drawImage(scaled, x, y, this); } } } 

一个更好的解决方案是拥有某种背景线程,可以对组件大小的变化作出反应,并在背景中重新缩放原始图像,从而提供低质量和高质量的比例。

还应注意, Image.getScaledInstance既不是最快或最高质量的缩放算法。 有关更多信息,请查看Image.getScaledInstance的Perils 。

您可能还会发现以下感兴趣的内容

Java:保持JPanel背景图像的纵横比

一种粗暴的方式..

 public void paintComponent(Graphics g) { super.paintComponent(g); g.draw(image,0,0,getWidth(),getHeight(),this); // ..