2009-05-11 13 views

Respuesta

17

Después de mirar el código fuente de pack(), se me ocurrió:

panel.setPreferredSize(panel.getPreferredSize()); 

Fuerza al panel de volver a calcular su tamaño preferido basado en los tamaños preferidos de sus subcomponenents.

Puede o no tener que llamar al validate() después; en mi pequeño ejemplo, parecía hacer ninguna diferencia, pero el Javadoc dice:

El método validate se utiliza para producir un recipiente para disponer de sus subcomponentes de nuevo. Se debe invocar cuando los subcomponentes de este contenedor se modifiquen (se agreguen o se eliminen del contenedor, o se modifique la información relacionada con el diseño) después de que se haya mostrado el contenedor.

Supongo que depende de por qué tiene que volver a embalar su JPanel.

+0

Thanks.It'll estar bien si usted no setsize, setPreferredSize o setMinimumSize. –

1

tal vez usted puede hacer algo así eliminando de su panel de

setResizable (false);

3

Por defecto Container s tienen un tamaño preferido que coincide con el tamaño de diseño preferido dado por el contenedor. Así que, literalmente, todo lo que tiene que hacer es:

panel.setSize(panel.getPreferredSize()); 

Es de suponer que está haciendo algo raro con los padres para dejar de controlador de disposición de los padres haciendo el equivalente de esto.

1

me gustaría probar:

panel.revalidate(); 
panel.repaint(); 

Esto no necesariamente se fijará el panel a su tamaño preferido, es más dependiente de lo que el controlador de distribución decide utilizar.

Esto es útil en los casos en que ha agregado/eliminado componentes de un panel que se muestra y es visible actualmente.

Actualización: Según su captura de pantalla, puedo decir lo siguiente: 1) Considere la posibilidad de cambiar programáticamente la ubicación del divisor. 2) Considere redimensionar programáticamente la ventana en sí, ya que parece un poco apretada para mostrar ambos lados del panel dividido. O ambos. Puede establecer la ubicación divisor Haciendo

splitPane.setDividerLocation(newSize); 

Tenga en cuenta que hay dos métodos sobrecargados para esto, uno teniendo un flotador uno teniendo un int. El flotante tiene un porcentaje del tamaño mientras que int es el tamaño en píxeles. El tamaño es para el panel de la izquierda (o el panel superior para esa orientación). Consideraría posiblemente cambiar la ubicación del divisor en función del ancho preferido de los paneles.

+0

ver la edición para ver el problema exacto –

0

JSplitPanes son un poco quisquillosos en lo que respecta a los tamaños de sus hijos, eche un vistazo a the Java tutorial. ¿Estás usando el GridBagLayout correctamente? Parece que no está configurando correctamente el tamaño mínimo de JPanel.

0

Los misterios de javax.swing se revelan solo de forma gradual, y solo a aquellos que están dispuestos a ofrecer muchas libaciones (particularmente conjuntos de cabello arrancados, horas quemando el aceite de medianoche, etc.) a los dioses de Swing.

Sin embargo, para este ejemplo de ello me permito sugerir lo siguiente como una especie de navaja suiza que por lo general hace lo que cree que el marco debe hacer de todos modos:

myJPanel.getTopLevelAncestor().validate() 

Como dice el texto sagrado, "Valida este contenedor y todos sus subcomponentes ". (Container.validate). NB getTopLevelAncestor() es un método JComponent.

No puedo recordar cómo JSplitPane encaja en esto: pruébalo y probablemente encontrarás que valida ambos componentes (derecho e izquierdo, superior e inferior), pero me sorprendería si cambiar el divisor no funciona esto para ti de todos modos.

1

Tuve un problema similar al usar Netbeans GUI Builder. Mis paneles internos estaban obteniendo tamaños extraños; Estaba intentando ajustar manualmente los tamaños mínimo y preferido, lo cual fue un ejercicio frustrante.

El problema se resolvió cuando restablecer todos los tamaños mínimos y preferidos a los valores predeterminados (en NetBeans GUI Constructor: haga clic derecho en el componente JPanel -> Propiedades -> preferredSize -> Restablecer valores predeterminados). Cuando no hay un tamaño impuesto, el jpanel toma el tamaño del componente interno.

Nota: GridBaLayout se utilizó en mi caso

Cuestiones relacionadas