2010-02-03 17 views
17

Hola estoy usando un BoxLayout apilar JPanel s en la parte superior de uno al otro (BoxLayout.Y_AXIS), por ejemplo, si mi padre JPanel es de altura de 500 píxeles y añado dos paneles secundarios a que ambos altura 100 píxeles. El BoxLayout los estira para que juntos ocupen el espacio de 500px. ¿Alguien sabe cómo desactivar esta característica?BoxLayout extiende componente adecuado para el panel de padres

+0

¿Cómo estás sepcifying el tamaño de los paneles hijos? – Ascalonian

+0

Con panel.setPrefferedSize y panel.setMinimumSize ambos usando la misma Dimensión – Aly

Respuesta

10

Use GridBagLayout en su lugar. Usted tiene mucho más control sobre su UI.

Pero si desea utilizar BoxLayout todavía, y no desea que se estire, puede consultar usando invisible component fillers como áreas rígidas, pegamento y rellenos.

+3

Si me bajas, por favor proporciona un motivo – Ascalonian

+0

Asegúrate de revisar la sección "Pegado horizontal" en el enlace publicado. Muy útil. – FuriousFolder

3

Sus paneles se estiran porque BoxLayout no limita cada panel a su tamaño preferido. Debe encontrar diseños que respeten el tamaño preferido de un componente, como lo hacen las posiciones NORTH y SOUTH de BorderLayout.

Prueba esto:

  1. Crear un JPanel con un BorderLayout. Agregue su componente secundario como NORTE en este JPanel.
  2. Cree un segundo JPanel para el otro componente secundario, agréguelo como NORTE de un BorderLayout
  3. Agregue los dos JPanels a su BoxLayout.

Código:

JPanel panel1 = new JPanel(new BorderLayout()); 
panel1.add(component1, BorderLayout.NORTH); 
JPanel panel2 = new JPanel(new BorderLayout()); 
panel2.add(component2, BorderLayout.NORTH); 

JPanel boxPanel = new JPanel(); 
BoxLayout boxLayout = new BoxLayout(boxPanel, BoxLayout.Y_AXIS); 
boxPanel.setLayout(boxLayout); 
boxPanel.add(panel1); 
boxPanel.add(panel2); 
+1

Me gusta esta solución porque evita jugar con la grilla y modificar los componentes, lo que es una gran ventaja. –

1

El truco es, como la respuesta anterior mencionado, para usar el pegamento, materiales de relleno, y las zonas rígidas en el diseño de la caja. Sin embargo, a diferencia de ese respondedor, recomendaría seguir con BoxLayout: puede lograr la mayoría de las UI simples con Box más que con Grid Bag; y el poder extra no te compra mucho en tu cuadro de diálogo típico.

En el antiguo idioma, estas eran cosas como Box.createHorizontalStrut (int x) y Box.createHorizontalGlue(); la idea es colocar un puntal entre su primer y segundo componente y luego agregar un pegamento después del segundo. ("puntal" = "área rígida" hoy en día).

+0

Estoy de acuerdo con eso para fines generales de apilamiento, el GridBagLayout puede ser excesivo. Solo sugiriéndolo si él avanza. – Ascalonian

+0

He tratado de poner un área rígida entre los dos paneles secundarios y el adhesivo vertical después de la segunda, puse los paneles todavía se estiran: s – Aly

+0

No existe una sobrecarga :) – willcodejavaforfood

20

BoxLayout es uno de los pocos administradores de diseño que respeta los tamaños mínimo y máximo de un componente. Así que si desea evitar que un panel de estiramiento que puede utilizar:

panel.setMaximumSize(panel.getPreferredSize()); 
+0

Esto puede haber sido hace un tiempo, pero ¿es eso usando un método obviado GetPreferredSize()? – MikeM

+0

@MikeM, no, ya que el panel confía en el administrador de diseño para devolver el tamaño preferido. En realidad, una mejor solución es extender el JPanel y anular el método 'getMaximumSize()' para simplemente devolver el valor del método 'getPreferredSize()'. De esta forma, el tamaño máximo se calculará dinámicamente en caso de que el tamaño preferido cambie dinámicamente. – camickr

+0

Interesante, gracias. – MikeM

2

Esto parece funcionar perfectamente bien ... usando BoxLayout, como lo hubiera querido.

test

this.setLayout(new FlowLayout()); // this being the JFrame 

    JPanel panel = new JPanel(); 
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    panel.setPreferredSize(new Dimension(500, 500)); 
    panel.setBackground(Color.orange); 
    this.add(panel); // add the parent to the JFrame 

    JPanel pnlChild1 = new JPanel(); 
    pnlChild1.setBackground(Color.cyan); 
    pnlChild1.setMaximumSize(new Dimension(200, 100)); 

    JPanel pnlChild2 = new JPanel(); 
    pnlChild2.setBackground(Color.magenta); 
    pnlChild2.setMaximumSize(new Dimension(200, 100)); 

    panel.add(pnlChild1); 
    panel.add(pnlChild2); 
Cuestiones relacionadas