Advanced Java Services | Schachtelung von Layouts |
Ein Frame hat ein Borderlayout, das fünf Komponenten aufnehmen kann. Was tun, wenn man aber im Norden eine Reihe von etwa fünf Buttons haben will oder im Osten drei Sliders nebeneinander. Ganz einfach, man nimmt ein Panel. Nehmen wir das erste Beispiel:
public class Schachteln1 extends Frame { private Panel northPanel; private Button[] butts ; // usw. public Schachteln1() { initNorth(); // usw. } private void initNorth() { northPanel = new Panel(); northPanel.setBackground( new Color(250,240,230) ); butts = new Button[] { new Button("Das") , new Button("ist") , new Button("ja") , new Button("ganz") , new Button("einfach") } ; for(int i=0; i<butts.length; i++) northPanel.add(butts[i]); add(northPanel, BorderLayout.NORTH); } // usw. }
Wir haben dem Panel ein eigene Farbe gegeben, damit man seine Größe deutlich sieht.
Vielleicht empfindet man es als schöner, wenn die Buttons gleich groß sind. Nun, dann ändern wir einfach das Layout des Panels auf GridLayout.
public class Schachteln2 extends Frame { // wie oben. public Schachteln1() { // wie oben. } private void initNorth() { northPanel = new Panel(); northPanel.setLayout( new GridLayout() ); northPanel.setBackground( new Color(250,240,230) ); // wie oben. } // usw. }
Jetzt sieht das so aus.
Setzt man Swing ein, so kann man den Buttons mit setPreferredSize() die gleiche Größe geben und als Layout FlowLayout lassen.
import java.awt.*; import javax.swing.*; public class Schachteln3 extends JFrame { private JPanel northPanel = new JPanel(); private JButton[] butts ; private Container conPane; public Schachteln3() { conPane = getContentPane(); initNorth(); initFrame(); } private void initNorth() { northPanel.setBackground( new Color(250,240,230) ); //northPanel.setLayout( new GridLayout() ); butts = new JButton[] { new JButton("Das") , new JButton("ist") , new JButton("ja") , new JButton("ganz") , new JButton("einfach") } ; for(int i=0; i<butts.length; i++) { butts[i].setPreferredSize( new Dimension(77,24) ); northPanel.add(butts[i]); } conPane.add(northPanel, BorderLayout.NORTH); } private void initFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); conPane.setBackground( new Color(230,240,250) ); setLocation(100,70) ; setSize(510,170); setTitle(" Ein JPanel mit FlowLayout im Norden eines BorderLayouts"); setVisible(true); } public static void main (String[] args) { Schachteln3 wnd = new Schachteln3(); } }
Hier das Ergebnis.
Meist führt das Schachteln von Layouts schneller zum Ziel als ein Layout mit GridBagLayout zu erstellen. So verwendet das BeispielApplet zum GridBagLayout als Basis ein BorderLayout. An den vier Rändern wird das Layout durch Schachtelung erreicht. Nur im Zentrum ist ein Container mit einem GridBagLayout.