Il punto è: quando (e dove) richiami quel sistema_dimensione_immagine_() ? Perché evidentemente l'approccio non è fatto nel modo giusto (o nel posto giusto).
In questi casi meglio magari scegliere un altro approccio. Ad esempio quello di farsi un banale JPanel custom che disegna la immagine in maniera scalata che sia "giusta" per la dimensione fisica del componente. L'algoritmo di scalamento è quello classico del "fit box".
Guarda questo che ho scritto al volo (l'immagine è presa dal tutorial Oracle, non sapevo cosa altro referenziare ...).
Prova a ridimensionare quanto/come vuoi la finestra, la immagine viene scalata mantenendo l'aspect-ratio e restando centrata.
import java.awt.Dimension;
import java.awt.Graphics;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class FrameProva extends JFrame {
public FrameProva() {
super("Prova");
setDefaultCloseOperation(EXIT_ON_CLOSE);
try {
ImageIcon imageIcon = new ImageIcon(new URL("https://docs.oracle.com/javase/tutorial/figures/2d/stonehenge.gif"));
add(new ScalableImage(imageIcon));
} catch (MalformedURLException e) {
System.err.println(e);
}
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new FrameProva().setVisible(true));
}
}
class ScalableImage extends JPanel {
private ImageIcon imageIcon;
public ScalableImage(ImageIcon imageIcon) {
this.imageIcon = imageIcon;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(imageIcon.getIconWidth(), imageIcon.getIconHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
double widthRatio = (double) getWidth() / imageIcon.getIconWidth();
double heightRatio = (double) getHeight() / imageIcon.getIconHeight();
double minRatio = Math.min(widthRatio, heightRatio);
int w = (int) (imageIcon.getIconWidth() * minRatio);
int h = (int) (imageIcon.getIconHeight() * minRatio);
int x = (getWidth() - w) / 2;
int y = (getHeight() - h) / 2;
g.drawImage(imageIcon.getImage(), x, y, w, h, this);
}
}