Estos artefactos de interacción se denominan widgets. En la ventana los artefactos se organizan en una jerarquía de componentes gráficas:
La clase de los contenedores sirve para crear áreas en la ventana cuyo único fin es colocar otras componentes en su interior. Hay dos tipos de contenedores:
El argumento que recibe el constructor es la etiqueta que se colocará sobre el botón. El aspecto y comportamiento de este botón es dependiente de la plataforma. La aplicación se basa sólo en que será informada cuando el botón sea presionado por el usuario para ejecutar alguna acción.Button boton= new Button("Button")
Los otros artefactos se crearon con:
Label.CENTER es una constante de la clase Label y puesta como argumento en el constructor indica que el nombre de la etiqueta estará centrado en el rectángulo que se le asigne dentro de la ventana.Label etiq= new Label("Label", Label.CENTER);
Usualmente un artefacto posee varios constructores con distintos parámetros. En este caso se especificó que el contenido inicial es "TextArea" y se necesitan 5 filas y 20 columnas. Sin embargo el contenedor puede asignar más espacio para distribuir mejor los artefactos en la ventana.TextArea textArea= new TextArea("TextArea", 5, 20);
Las componentes de AWT se manipulan mediante métodos. En éste la lista se llena usando addItem.List lista = new List(3, false); for (int i = 1; i <= 10; i++) { lista.addItem("List item " + i); }
Los artefactos que hemos visto hasta el momento son simples porque la plataforma sabe como dibujarlos y qué tamaño deben ocupar. Es decir la aplicación no necesita especificar tamaño ni forma.
El canvas es un artefacto complicado porque AWT no conoce en absoluto el aspecto que debe tener en la ventana. Por lo tanto es la aplicación la que se debe preocupar de especificar qué tamaño debe tener y cómo se dibuja. Lo anterior se logra creando una nueva clase derivada a partir de Canvas. En ella se redefinen algunos métodos que realizan las funciones que un canvas normal no sabe hacer:
El principio es que todas las componentes tienen un método paint que AWT invoca cada vez que la componente se descubre y por lo tanto hay que redibujarla. La mayoría de las componentes (como botones, listas, etc.) saben dibujarse porque en la clase respectiva se redefinió el método paint con el código apropiado para mostrar su aspecto.class MyCanvas extends Canvas { public void paint(Graphics g) { int w = size().width; int h = size().height; g.drawLine(10,10, 100,100); } public Dimension minimumSize() { return new Dimension(150,130); } public Dimension preferredSize() { return minimumSize(); } }
Sin embargo el aspecto de un canvas es absolutamente dependiente de la aplicación. Por lo tanto es la aplicación la que redefine paint con sus propias instrucciones para dibujar el artefacto. Si este método no se redefine, el canvas no será dibujado cuando la ventana sea descubierta. El método paint recibe un argumento g que acepta primitivas gráficas como drawLine.
Del mismo modo, AWT invoca los métodos minimunSize y preferredSize para conocer el tamaño mínimo y preferido de una componente. Botones, listas, barras de deslizamiento, etc. han redefinido estos métodos.
Entonces en el nuevo canvas también se redefinen estos métodos para indicar el tamaño apropiado. Si estos no se redefinen el canvas podría quedar reducido a un tamaño 0. El nuevos canvas puede determinar su tamaño real en la ventana consultando su propio método size.
Los contenedores usan organizadores (layout manager) para distribuir los artefactos en la superficie de despliegue de la mejor forma. Cada tipo de contenedor tiene su propio organizador. Por ejemplo los paneles usan FlowLayout que coloca los artefactos de izquierda a derecha.
Para el contenedor de la raiz (Gui) definimos explícitamente un organizador por medio de:
Observe que como no se especifica objeto en la invocación, el método se aplica al objeto principal, que en este caso es la raíz (un frame).public class Gui extends Frame { Gui() { setLayout(new BorderLayout()); ... }
Para crear el panel y colocar en su interior los artefactos se usa:
Para colocar los artefactos en el frame (es decir en un objeto de la clase Gui) se usa el método add, pero con un argumento adicional que dice si cada artefacto se agrega a la izquierda, arriba, etc. Esto es específico del organizador BorderLayout.// Crear panel Panel bottomPanel = new Panel(); // Crear artefactos texto= new TextField("TextField"); boton= new Button("Button"); check= new Checkbox("Checkbox"); // Agregarlos al panel bottomPanel.add(texto); bottomPanel.add(boton); bottomPanel.add(check);
Cuando se invoca pack en el frame se invoca el organizador que asigna un rectángulo a cada artefacto. A estas alturas todavía no se muestra en la pantalla la ventana. Para realizar esto se invoca el método show del frame.// Define el organizador setLayout(new BorderLayout()); // Crear artefactos ... // Agregar artefactos add("Center", canvas); add("North", etiqueta); add("West", areaTexto); add("East", lista); // Agregar el panel add("South", bottomPanel);