Combinación de layouts Los layouts que analizamos hasta aquí son en sí mismos muy limitados y no tienen la flexibilidad suficiente que nos permita pensar en diseñar una interfaz gráfica que pueda resultar verdaderamente funcional. Sin embargo, si pensamos que una GUI puede construirse en base a combinaciones de estos layouts entonces la cosa puede ser diferente. Comenzaremos por un caso simple: una calculadora. Esta interfaz gráfica se logra utilizando un BorderLayout que en el norte tiene una instancia de TextField (el display) y en el centro tiene un Panel (otro container) con un GridLayout de 4 flas por 4 columnas con un Button en cada celda. package unidad_1; import java.awt.*; public class Calculadora extends Frame { private Button b0, b1, b2, b3, b4, b5, b6, b7, b8, b9; private Button bDec, bMas, bMenos, bPor, bDiv, bIgual, bBorrar; private TextField tfDisplay; public Calculadora() { super(); setLayout(new BorderLayout()); // en el NORTE ubico el display tfDisplay = new TextField(); add(tfDisplay, BorderLayout.NORTH); // en el CENTRO ubico el teclado Panel pTeclado = _crearTeclado(); add(pTeclado, BorderLayout.CENTER); // este metodo dimensiona y setea el tamanio exacto // necesario para contener todos los componentes del Frame pack(); setVisible(true); } private Panel _crearTeclado() { // instancio los 16 botones b0 = new Button("0"); b1 = new Button("1"); b2 = new Button("2"); b3 = new Button("3"); b4 = new Button("4"); b5 = new Button("5"); b6 = new Button("6"); b7 = new Button("7"); b8 = new Button("8"); b9 = new Button("9"); bDec = new Button("."); bMas = new Button("+"); bMenos = new Button("-"); bPor = new Button("*"); bDiv = new Button("/"); bIgual = new Button("="); // instancio un Panel (un container) con GridLayout de 4 x 4 Panel p = new Panel(new GridLayout(4, 4)); // Agrego los botones al panel // fila 0 (la mas de mas arriba) p.add(b7); p.add(b8); p.add(b9); p.add(bDiv); // fila 1 (la segunda comenzando desde arriba) p.add(b4); p.add(b5); p.add(b6); p.add(bPor); // fila 2 (la tercera comenzando desde arriba) p.add(b1); p.add(b2); p.add(b3); p.add(bMenos); // fila 3 (la cuarta comenzando desde arriba) p.add(bDec); p.add(b0); p.add(bIgual); p.add(bMas); // retorno el Panel con todos los botones agregados return p; } public static void main(String[] args) { Calculadora c = new Calculadora(); } } Pasemos ahora a un ejemplo con mayor complejidad: una ventana de chat. Volviendo a la GUI de la ventana de chat, podemos verla dividida de la siguiente manera: package unidad_1; import java.awt.*; public class chat extends Frame { private TextField tfNick; private TextField tfMensaje; private Button bLogin; private Button bLogout; private Button bEnviar; private List lstLog; public chat() { super("Chat"); setLayout(new BorderLayout()); // panel norte Panel pNorth = _crearPNorte(); add(pNorth, BorderLayout.NORTH); // panel central Panel pCenter = _crearPCenter(); add(pCenter, BorderLayout.CENTER); // panel sur Panel pSouth = _crearPSur(); add(pSouth, BorderLayout.SOUTH); setSize(400, 300); setVisible(true); } private Panel _crearPNorte() { Panel p = new Panel(new FlowLayout(FlowLayout.LEFT)); p.add(new Label("Nick:")); tfNick = new TextField(10); p.add(tfNick); bLogin = new Button("Login"); p.add(bLogin); bLogout = new Button("Logout"); p.add(bLogout); return p; } private Panel _crearPCenter() { Panel p = new Panel(new BorderLayout()); // norte p.add(new Label("Conversacion:"), BorderLayout.NORTH); // centro lstLog = new List(); p.add(lstLog, BorderLayout.CENTER); return p; } private Panel _crearPSur() { Panel p = new Panel(new BorderLayout()); // oeste p.add(new Label("Mensaje:"), BorderLayout.WEST); // centro tfMensaje = new TextField(); p.add(tfMensaje, BorderLayout.CENTER); // este bEnviar = new Button("Enviar"); p.add(bEnviar, BorderLayout.EAST); return p; } public static void main(String[] args) { chat c = new chat(); } }