vertical setlayout layouts gridlayout java user-interface swing

setlayout - layout java wikipedia



BoxLayout estira el componente para adaptarse al panel principal (5)

BoxLayout es uno de los pocos administradores de diseño que respeta los tamaños mínimo y máximo de un componente. Entonces, si quieres evitar que un panel se estire, puedes usar:

panel.setMaximumSize( panel.getPreferredSize() );

Hola. Estoy usando un BoxLayout para apilar JPanel s uno encima del otro ( BoxLayout.Y_AXIS ), por ejemplo, si mi JPanel principal es de 500 píxeles de altura y le agrego dos paneles secundarios de 100 píxeles de altura. El BoxLayout estira para que juntos ocupen el espacio de 500px. ¿Alguien sabe como deshabilitar esta característica?


El truco es, como se mencionó en la respuesta anterior, usar pegamento, rellenos y áreas 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 IU más sencillas con Box que con Grid Bag; y la potencia adicional 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 que coloques un puntal entre los componentes primero y segundo y luego agregues un pegamento después del segundo. ("puntal" = "área rígida" hoy en día).


Esto parece funcionar perfectamente bien ... usando BoxLayout, como quisieras.

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);


Sus paneles se están estirando porque BoxLayout no restringe 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 NORTE y SUR de BorderLayout.

Prueba esto:

  1. Crea un JPanel con un BorderLayout. Agregue su componente hijo 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);