Dipende da cosa dovrebbe essere il comportamento quando la finestra viene ridimensionata. Ma non eviterai di costruire una struttura ad albero con JPanels.
Il componente superiore può avere BorderLayout, con un pannello nel Nord e il pannello principale in Centro.
Il pannello Nord avrà BoxLayout dell'asse X e contiene due pannelli.
Entrambi questi cartelli dovrebbero avere asse Y BoxLayout e il primo conterranno A, C, F ed il secondo B, D, E.
È inoltre necessario impostare le dimensioni preferite per ABCDE e F in modo che rendono con dimensioni appropriate.
EDIT:
Qui, ho creato un esempio:
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);
}
}
è possibile omettere il setPreferredSize(), ho aggiunto solo per demonstate comportamento. Puoi anche provare a ridimensionare la finestra. Il codice è molto più breve che quando si utilizza GridBagLayout.
fonte
2012-03-12 00:18:44
No, non usare _non_ ['setPreferredSize()'] (http: // stackoverflow.com/q/7229226/230513); lascia che il contenuto determini le dimensioni dopo 'pack()'. – trashgod
-1 se _won't evitare di costruire un albero_ si traduce in "pannelli di nidificazione" (come da descrizione): semplicemente sbagliato - ci sono i LayoutManager (anche nel core) che possono raggiungere quasi tutti gli obiettivi senza – kleopatra
Naturalmente, si può anche usare il layout nullo. Ma alcuni layout sono più facili e chiari da usare rispetto agli altri. Voglio dire, basta dare un'occhiata al codice di Gagandeep. –