java swing jframe jpanel preferredsize

java - getPreferredSize() solo se llama dos veces después del paquete()



swing jframe (2)

Intente volver a validar su JPanel para que lo llame: tamaño preferido:

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PackTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } public static void createAndShowGui() { final JFrame f = new JFrame(); final JPanel panel = new JPanel() { int i = 0; @Override public Dimension getPreferredSize() { System.out.println("getPreferredSize() called"); if (i++ >= 2) return new Dimension(200, 200); // This is never returned else return new Dimension(100, 100); } }; f.add(panel); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); int delay = 1000; new Timer(delay, new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { System.out.println("Calling pack()"); panel.revalidate(); f.pack(); } }).start(); } }

Por otro lado, querrás asegurarte de que con tu código real te esfuerces por respetar las reglas de enhebrado de Swing.

¿Por qué se getPreferredSize() solo dos veces cuando se llama a pack() en un JFrame , como en el siguiente ejemplo?

public class PackTest { static JFrame f = new JFrame(); @SuppressWarnings("serial") public static void main(String[] args) { f.add(new JPanel() { int i = 0; @Override public Dimension getPreferredSize() { System.out.println("getPreferredSize() called"); if(i++ >= 2) return new Dimension(200, 200); // This is never returned else return new Dimension(100, 100); } }); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); for(int i = 0; i < 10; i++) { try { TimeUnit.SECONDS.sleep(1); } catch(InterruptedException e) {} SwingUtilities.invokeLater(new Runnable() { @Override public void run() { System.out.println("Calling pack()"); f.pack(); } }); } } }

Parece que getPreferredSize() solo se llama siempre y cuando getPreferredSize() devolviendo algo diferente (es decir, si devuelve una dimensión diferente cada vez, se llamará 10 veces en el ejemplo). ¿Por qué Swing hace esto y cómo hago para que pack() cambie el tamaño del JFrame correctamente?


getPreferredSize() siempre se getPreferredSize() cuando el contenedor padre cambia de tamaño o se revalida. Cualquiera que sea el valor de Dimension devuelto por este método, impone un tamaño fijo en un componente (si se reemplaza) que no debería cambiar independientemente del tamaño de la ventana y los demás componentes.