Depende de cuál debería ser el comportamiento cuando se cambia el tamaño de la ventana. Pero no evitarás construir una estructura de árbol con JPanels.
El componente superior puede tener BorderLayout, con un panel en el norte y el panel principal en el centro.
El panel Norte tendrá BoxLayout en el eje X y contendrá dos paneles.
Ambos estos paneles deben tener eje Y BoxLayout y el primero contendrán A, C, F y la segunda B, D, E.
También debe establecer tamaños preferidos para ABCDE y F para que rinda con el tamaño apropiado.
EDIT:
Aquí, he creado un ejemplo:
public class GladysPanel extends JPanel
{
public GladysPanel(JComponent A, JComponent B, JComponent C, JComponent D, JComponent E, JComponent F, JComponent main){
super(new BorderLayout());
JPanel abcdef = new JPanel(new BorderLayout());
Box ab = new Box(BoxLayout.X_AXIS);
ab.add(A);
ab.add(B);
abcdef.add(ab, BorderLayout.NORTH);
Box cdef = new Box(BoxLayout.X_AXIS);
Box cf = new Box(BoxLayout.Y_AXIS);
cf.add(C);
cf.add(F);
cf.add(Box.createVerticalGlue());
Box de = new Box(BoxLayout.Y_AXIS);
de.add(D);
de.add(E);
de.add(Box.createVerticalGlue());
cdef.add(cf, BorderLayout.WEST);
cdef.add(de, BorderLayout.EAST);
abcdef.add(cdef);
add(abcdef, BorderLayout.NORTH);
add(main);
}
public static void main(String[] args){
JPanel A = new JPanel();
A.setOpaque(true);
A.setBackground(Color.BLUE);
A.add(new JLabel("A"));
JPanel B = new JPanel();
B.setOpaque(true);
B.setBackground(Color.LIGHT_GRAY);
B.add(new JLabel("B"));
JPanel C = new JPanel();
C.setPreferredSize(new Dimension(0, 100));
C.setOpaque(true);
C.setBackground(Color.RED);
C.add(new JLabel("C"));
JPanel D = new JPanel();
D.setOpaque(true);
D.setBackground(Color.PINK);
D.add(new JLabel("D"));
JPanel E = new JPanel();
E.setOpaque(true);
E.setBackground(Color.YELLOW);
E.add(new JLabel("E"));
E.setPreferredSize(new Dimension(0, 60));
JPanel F = new JPanel();
F.setOpaque(true);
F.setBackground(Color.MAGENTA);
F.add(new JLabel("F"));
JPanel main = new JPanel();
main.setOpaque(true);
main.setBackground(Color.WHITE);
main.add(new JLabel("main"));
GladysPanel panel = new GladysPanel(A, B, C, D, E, F, main);
JFrame example = new JFrame("Gladys example");
example.setContentPane(panel);
example.setSize(300, 300);
example.setVisible(true);
}
}
se puede omitir el setPreferredSize(), que añade sólo a demonstate comportamiento. También puede intentar cambiar el tamaño de la ventana. El código es mucho más corto que cuando se usa GridBagLayout.
No, no _no_ use ['setPreferredSize()'] (http: // stackoverflow.com/q/7229226/230513); deja que el contenido determine el tamaño después de 'pack()'. – trashgod
-1 si _sin evitar construir un árbol_ se traduce en "paneles de anidación" (según su descripción): simplemente incorrecto - hay Administradores de diseño (incluso en el núcleo) que pueden lograr casi cualquier objetivo sin – kleopatra
Por supuesto, incluso puede usar el diseño nulo Pero algunos diseños son más fáciles y más claros de usar que los otros. Quiero decir, solo eche un vistazo al código de Gagandeep. –