¿Cómo cambio el tamaño de las imágenes dentro de una aplicación cuando se cambia el tamaño de la ventana de la aplicación?

Cuando maximizo mi aplicación, las imágenes dentro de JPanel no cambian su tamaño. ¿Cómo puedo hacer que JPanel y su contenido se ajusten cuando la ventana está maximizada?

EDITAR: estoy usando BufferedImage

Esa es una pregunta abierta.

¿Desea escalar para rellenar o escalar para adaptarse al área o no le importa la relación de aspecto?

La diferencia entre la escala para llenar y la escala para adaptarse

enter image description hereenter image description here

Este ejemplo reactjsrá a los cambios en el tamaño del marco y la escala de la imagen en tiempo real.

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

Una solución mejor sería tener un hilo de fondo de algún tipo que pueda reactjsr a los cambios en el tamaño del componente y cambiar la escala de la imagen original en segundo plano, proporcionando una escala de baja calidad y alta calidad.

También se debe tener en cuenta que Image.getScaledInstance no es el algoritmo de escalado de calidad más rápido o más alto. Eche un vistazo a The Perils of Image.getScaledInstance para obtener más información.

También puede encontrar el siguiente de interés

Java: mantenimiento de la relación de aspecto de la imagen de fondo de JPanel

Una forma cruda …

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