Zależy od tego, jakie powinno być zachowanie podczas zmiany rozmiaru okna. Ale nie unikniesz budowania struktury drzewa za pomocą JPanels.
Komponent górny może mieć BorderLayout, z jednym panelem na północy i głównym panelem w środku.
Panel północny będzie miał BoxLayout w osi X i będzie zawierać dwa panele.
Oba te panele powinny mieć BoxLayout w osi Y, a pierwszy zawierać będzie A, C, F, a drugi B, D, E.
Powinieneś również ustawić preferowane rozmiary dla ABCDE i F, aby renderowały o odpowiedniej wielkości.
EDIT:
Tutaj, stworzyłem przykład:
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);
}
}
można pominąć setPreferredSize(), dodałem go tylko do demonstate zachowanie. Możesz również spróbować zmienić rozmiar okna. Kod jest znacznie krótszy niż przy korzystaniu z GridBagLayout.
Nie, _nie_ używaj ['setPreferredSize()'] (http: // stackoverflow.com/q/7229226/230513); niech treść określi rozmiar po 'pack()'. – trashgod
-1 jeśli _nie unikniesz budowania drzewa_ tłumaczy się na "panele gniazdowe" (zgodnie z twoim opisem): po prostu źle - są LayoutManagers (nawet w rdzeniu), które mogą osiągnąć prawie każdy cel bez – kleopatra
Oczywiście, możesz nawet użyć układ zerowy. Ale niektóre układy są łatwiejsze i bardziej przejrzyste w użyciu niż inne. Po prostu spójrz na kod Gagandeep. –