La clase desciende de
Frame (o sea que será una ventana con borde, aunque no le vamos a poner menú).
Vamos a usar el flag
inAnApplet para saber si se arrancó como applet o como aplicación standalone (hay que cerrarla en manera diferente en cada caso)
public class Ejemplo7 extends Frame {
boolean inAnApplet = true;
Si se llama como aplicación standalone, lo primero que se ejecuta es main(...); en este caso la aplicación crea una instancia de Ejemplo7 (ejecutando el constructor Ejemplo7() a través de
new), define que
no es un applet, y llama a tres métodos de la "abuela" window:
- setTitle que define cuál va a ser el título que aparece en la ventana
- pack que dimensiona los elementos que componen la ventana a su tamaño preferido
- show que muestra la ventana
public static void main(String args[]) {
Ejemplo7 window = new Ejemplo7();
window.inAnApplet = false;
window.setTitle("Ejemplo");
window.pack();
window.show();
}
Ojo! No confundir el objeto (instancia) window con la clase
Window!
Si se carga como applet, entonces se ejecuta el constructor Ejemplo7() como en el caso anterior:
public Ejemplo7() {
Panel panelAlto = new Panel();
panelAlto.add("West", new Label("Cartel", Label.CENTER));
panelAlto.add("East", new TextArea("Area de texto", 5, 20));
add("North", panelAlto);
Panel panelBajo = new Panel();
panelBajo.add(new TextField("Campo de Texto"));
panelBajo.add(new Button("Botón"));
add("South",panelBajo);
}Este constructor define dos paneles que forman el contenido de la ventana
(panelAlto y panelBajo), los llena con un par de componentes y los pone
dentro de la ventana (recordar que Ejemplo7 es una ventana!).
Para verlo más claro, se crea el panel (o espacio para contener objetos) con:
Panel panelAlto = new Panel();
Se agregan componentes al panel con el método add:
panelAlto.add("West", new Label("Cartel", Label.CENTER));
panelAlto.add("East", new TextArea("Area de texto", 5, 20));
Se agregan el panel dentro de nuestro objeto con:
add("North", panelAlto);
que equivale a:
this.add("North", panelAlto);
lo que se puede ver (aunque es inválido porque la clase no es static) como:
Ejemplo7.add("North", panelAlto);
Como nuestra clase Ejemplo7 desciende de Frame, ésta de Window, y ésta de Container, el método
add lo está heredando de... su bisabuela! Por otra parte, Panel es hija de Container, y usa el mismo método para agregar sus componentes. Interesante, no? Veamos la estructura:
Object
Component
Container --+-- Panel
|
+-- Window
Frame
Ejemplo7
Noten que hemos usado dos métodos add con diferente
signature:
panelAlto.add("West", new Label("Cartel", Label.CENTER));
..........
panelBajo.add(new Button("Botón"));
El método add(Component) agrega un componente al final; el método add(String,Component) lo agrega en un lugar especificado por una palabra que depende del
LayoutManager, el objeto que se encarga de ordenar los componentes dentro del contenedor.
LayoutManager es una
interface, y como tal debe implementarse a través de objetos no abstractos de los que hay varios predefinidos en la librería java.awt: BorderLayout, CardLayout, FlowLayout, GridBagLayout y GridLayout.
El Layout por defecto es BorderLayout, que define en el contenedor las áreas "North", "South", "West", "East" y "Center" y es que usamos aquí. CardLayout permite "apilar" los componentes como cartas y ver uno por vez, FlowLayout los ordena de izquierda a derecha como un texto, GridLayout los ordena en una cuadrícula donde cada componente tiene un tamaño fijo y GridBagLayout los pone en una cuadrícula pero cada uno puede tener el tamaño deseado.
Noten que no hace falta llamar, en el caso del applet, a Pack() y Show().