2009-06-01 18 views
6

En un GridBagLayout, ¿qué componente es el mejor para proporcionar espacio vacío en un panel? Idealmente me gustaría utilizar un componente que tiene:Componente espaciador más liviano en un GridBagLayout

  1. baja sobrecarga
  2. Ningún efecto secundario cuando no se requiere espacio vacío (es decir, sin mínimo)
  3. Un constructor trivial (sin parámetros)

Un JPanel infringe el n. ° 2 anterior. Una caja requiere un parámetro constructor (n. ° 3 arriba), que en realidad no es necesario en este caso simple. Una JLabel funciona bien, pero me preocupa que pueda tener un poco de sobrecarga, aunque es cierto que probablemente sea bastante baja.

Una clase anónima también parece funcionar bien (es decir, "nuevo JComponent() {}"), pero eso agrega un archivo .class adicional cada vez que lo uso. Sin embargo, supongo que no es más sobrecargado que cualquier manejador de eventos. ¿Valdría la pena crear un componente personalizado de implementación cero derivado de JComponent para esto? ¿Existe un componente existente que me falta?

FYI GridBagLayout es una de mis limitaciones en el equipo del que soy parte, por lo que otros diseños no son una opción.

+0

también intentó una clase anónima derivado de componente (en lugar de JComponent), y esto parece funcionar bien también. Me preocupa un poco acerca de algunos posibles problemas de compatibilidad con la colocación de un componente AWT en una GUI de Swing (por ejemplo, la falta de doble búfer), pero ciertamente parece que sería una solución muy ligera. – dcstraw

+0

El componente debería estar bien. Lienzo no lo haría, ya que creará un par pesado, aunque creo que ha habido algún trabajo de mejora en esa área recientemente. –

Respuesta

10

Menciona la casilla, pero se puede utilizar de forma "ligera" con los siguientes cuatro métodos estáticos que simplemente devuelven un componente. Yo uso estos todo el tiempo. Son invisibles con respecto a la pintura. En tu caso, parece que los pegamentos son el camino a seguir. Un constructor trivial (¡es malo!), Bajo sobrecarga. El efecto secundario cuando no se requiere espacio depende de cómo organices tu grilla.

panel.add(Box.createHorizontalGlue()); 
panel.add(Box.createVerticalGlue()); 
panel.add(Box.createHorizontalStrut(int width)); 
panel.add(Box.createVerticalStrut(int width)); 

JavaDoc aquí: http://java.sun.com/javase/6/docs/api/javax/swing/Box.html

+0

Me gusta mucho esta solución. El método "createGlue()" también funciona bien para mis propósitos. Mi único problema con esto es que está destinado a BoxLayouts, pero trataré de superarlo y no ser tan exigente. :) Gracias por la respuesta! – dcstraw

+0

No hay necesidad de escrúpulos: de JavaDoc: "Box proporciona varios métodos de clase que son útiles para contenedores que usan BoxLayout, incluso contenedores que no son Box". – banjollity

+0

Tenga en cuenta que el documento vinculado recomienda evitar el uso de puntales, a favor de las áreas rígidas, para tamaños fijos. (Además de las áreas rígidas, use pegamento para espaciadores cultivables y Box.Filler personalizado para controlar el tamaño máximo/mínimo/preferido). –