HTMLpointHTMLpoint HTMLpoint.com


 ¿Qué es una aplicación a ventanas?



La aplicación a ventanas es el tipo de aplicación que más a menudo utilizamos cuando trabajamos con el ordenador. Es una aplicación que se pone en marcha de forma local, que utiliza como interfaz del usuario las tecnologías de las ventanas típica de los sistemas operativos Mac OS (en la que nació), Windows (todas sus variantes, Windows 3.1, Windows 95, 95-OSR2, 98, NT, 2000 y Millenium), XWindows (el servidor gráfico para Linux y Unix).
Casi todos los programas que se utilizan actualmente son aplicaciones a ventanas. Lo son, por ejemplo, Word, Netscape, Explorer, Jbuilder, Visual Studio, WinZip, Paint, XV, etc… (Todos pertenecen a los correspondientes productores).
Por lo tanto veremos cómo se crea una Ventana usando el paquete AWT.
Como siempre creamos una aplicación con el main, como hicimos anteriormente. Sin embargo, la clase que creamos ahora ampliará la clase java.awt.Frame, que representa la ventana completa, incluye el título, los pulsantes de reducción a icono, maximizar y cerrar.
La clase Frame tiene varios métodos y constructores que veremos dentro de poco. Ahora vamos a crear nuestra primera ventana con el título Primera Ventana y que no incluye nada. La editamos en Ventana.java.

import java.awt.*;

public class Ventana extends Frame
{

public Ventana()
{

super("Primera Ventana");

setLocation(100,100);

setSize(200,100);

show();

}



public static void main(String[] arg)
{
new Ventana();

System.out.println("he creado la ventana");
}

}

Al principio, como para cada aplicación, se invoca el main que crea un nuevo objeto de tipo Ventana. (El main y la ventana podrían estar en dos archivos separados, uno que gestiona el main, y el otro que gestiona la ventana).
En el constructor del objeto ventana se invoca al constructor de la superclase, es decir, del frame, con la cadena "Primera Ventana" (es el título). Luego se invoca el método setLocation que declara la posición del ángulo derecho en la parte que está arriba de la ventana en el desktop, en este caso <100, 100> (Son la x y la y respectivamente. La x se mide partiendo del lado izquierdo de la pantalla y aumenta a medida que se va hacia la derecha. La y se mide partiendo de la parte superior de la pantalla y aumenta a medida que se va hacia abajo).
Después se invoca el método setSize que permite especificar anchura y altura. En nuestro caso, tiene una anchura de 200 y una altura de 100. Finalmente se invoca el método show() y a continuación aparece la ventana en la pantalla.



Las coordinadas de la pantalla no son las coorinadas cartesianas. realmente la y es precisamente opuesta porque aumenta a medida de que se baja y desminuye a medida de que se sube. Éste es un problema que tiene no sólo Java, sino que todos los lenguajes de programación y todas las bibliotecas para la gráfica Raster. Se debe a razones históricas, supongo, debidas a la forma de dibujar los pixel en pantalla a nivel de hardware. Hay que acostumbrarse, pero las primeras veces puede provocar problemas de razonamiento.
Intentad redactar y poner en marcha el programa y cuando veáis vuestra primera ventana os animaréis. Sucesivamente eliminad, por turnos, los métodos setLocation, setSize y show, colocad también las ventanas en distintas posiciones y evaluad los cambios. En el ejemplo, se ven sucesos que el sistema gestiona automáticamente. Son Ir Resize de la Ventana y la presión de los pulsadores reduce a iconos y maximiza (minimiza), los cuales se gestionan en la clase Frame.
En cambio, no se gestiona el suceso cerrar ventana (el pulsador de la x). Si se teclea no ocurre nada y para acabar la puesta en marcha del programa hay que ir al prompt del DOS desde el que empezó la aplicación y teclear CTRL+C (el exit para todos los programas DOS).
Por último, creo que queda claro, la aplicación no funciona en ambientes que no son gráficos, es decir, en DOS y en Linux. Se necesita Windows (y el DOS cargado en una ventana, es decir, prompt de MS-DOS) o Xwindows con una shell abierta.

Además no es verdad que a una aplicación se puede asociar a una solo ventana. Java es un lenguaje que permite la multiprogramación. Cada ventana es un programa independiente que trabaja contemporaneamente con otros. Por eso puedo crear, para la misma aplicación, más ventanas FRame, como en el ejemplo que ofrecemos a continuación.

import java.awt.*;

public class Ventanas extends Frame
{

public Ventanas(String Nombre, ent x, ent y)
{

super(Nombre);

setLocation(x,y);

setSize(200,100);

show();

}



public static void main(String[] arg)
{

System.out.println("Creo 4 ventanas solapadas");

for (ent e1;i<5;i++) new Ventanas("Ventana "e,10+(e*10), 10+(e*10));

System.out.println("Creo 4 ventanas a cuadros");

for (ent e=5;e<9;e++) new Ventanas("Ventana "+e,(e-5)*200, 100+(e-5));


System.out.println("He creado las ocho ventanas");
}

}

Las mismas cosas se podían hacer extendiendo la clase JFrame del paquete javax.swing.

import javax.swing.*;

public class VentanaSwing extends JFrame
{

public VentanaSwing()
{

super("Primera Ventana");

setLocation(100,100);

setSize(200,100);

show();

}



public static void main(String[] arg)
{
new VentanaSwing();

System.out.println("He creado la ventana");

}

}

Este programa es como Ventana.java. lo único que amplía JFrame de swing. Las únicas diferencias son el contenido de la ventana, que esta vez es gris y antes era blanco, y el pulsador cerrar, que esta vez cierra la ventana (sólo la ventana y no toda la aplicación). Realmente la utilización de swing y de awt es muy parecida. Sin embargo, swing es más complejo y pone a disposición muchas más clases, y ofrece la posibilidad de cambiar el aspecto de las ventanas a runtime, etc.
Desgraciadamente, no todos los web browser las pueden utilizar. Por eso, nosotros veremos las awt, y después hablaremos de las swing, dejando claro que los que quieran hacer un aplique para su propria página html hasta ahora TIENEN que utilizar las awt. Dentro de poco, cuando el XML se convierta en estándar y se tengan que cambiar los browser, se podrá utilizar con toda tranquilidad swing incluso para los apliques.
Por lo tanto, vemos qué incluye la clase Frame. En primer lugar, los constructores son dos:

Frame() , que crea un Frame sin ningún título, al principio invisible.
Frame(String T), que crea un Frame con título T, también inicialmente invisible.

Los atributos de la clase son:
static int ICONIFIED
static int NORMAL

para indicar el estado de las ventanas y

static int CROSSHAIR_CURSOR
static int DEFAULT_CURSOR
static int E_RESIZE_CURSOR
static int HAND_CURSOR
static int MOVE_CURSOR
static int N_RESIZE_CURSOR
static int NE_RESIZE_CURSOR
static int NW_RESIZE_CURSOR
static int S_RESIZE_CURSOR
static int SE_RESIZE_CURSOR
static int SW_RESIZE_CURSOR
static int TEXT_CURSOR
static int W_RESIZE_CURSOR
static int WAIT_CURSOR

Todos se declaran como deprecated, para los cursores, remplazados por la clase Cursor. Hereda la alineación de los componentes de Component.

Los métodos son:

void addNotify(), conecta el frame a un recurso de la pantalla y lo convierte en visible.
int getCursorType(), declarado Deprecated. Es de la versión 1.1 de las JDK
static Frame[] getFrames(), da un array que incluye todos los Frames creados por la aplicación.
Image getIconImage(), da el icono del Frame. Es un objeto de tipo Icon, que analizaremos a continuación.
MenuBar getMenuBar(), devuelve la barra de los menús del frame. Es un objeto de tipo MenuBar, que analizaremos a continuación.
int getState(), da el estado del frame.
String getTitle(), da el título del frame
boolean isResizable(), da verdadero si el frame se puede agrandar y reducir con el ratón.
protected String paramString() , da la cadena que incluye los parámetros del Frame.
void remove(MenuComponent m), quita el MenuBar especificado por el frame.
void removeNotify(), quita la conexión entre el frame y el recurso que representa la pantalla, convirtiéndolo en algo que no se puede visualizar.
void setCursor(int cursorType), controla el cursor en JDK1.1. Se declara deprecated.
void setIconImage(Image image), averigua el icono del Frame.
void setMenuBar(MenuBar mb), asigna una MenuBar al frame.
void setResizable(boolean resizable), averigua el Frame que puede cambiar dimensiones o no. Por default lo es.
void setState(int state), averigua el estado del frame
void setTitle(String title), averigua el título del frame.

Frame es una clase que amplía java.awt.Window y, por eso, hereda los métodos y los atributos.
Realmente Frame es una Window que añade un borde y un MenuBar. Los métodos heredados de windows son:

addWindowListener, applyResourceBundle, applyResourceBundle, dispose, getFocusOwner, getInputContext, getLocale, getOwnedWindows, getOwner, getToolkit, getWarningString, isShowing, pack, postEvent, processEvent, processWindowEvent, removeWindowListener, show, toBack, toFront.

Window amplía java.awt.Container, es un contenedor de objetos AWT. Es un componente que puede incluir otros componentes. Por lo tanto, por la propiedad de la transitividad, Frame hereda los métodos y los atributos. Los métodos son:

add, add, add, add, add, addContainerListener, addImpl, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getInsets, getLayout, getMaximumSize, getMinimumSize, getPreferredSize, insets, invalidate, isAncestorOf, layout, list, list, locate, minimumSize, paint, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, remove, removeAll, removeContainerListener, setFont, setLayout, update, validate, validateTree

Container amplía java.awt.Component. Un Component es un objeto que tiene una representación gráfica, por ejemplo un cursor será una extensión de esta clase que amplía, a su vez, java.lang.Object
Los atributos heredados por Component son:

BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT

mientras los métodos heredados por Component son:

action, add, addComponentListener, addFocusListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addPropertyChangeListener, addPropertyChangeListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, getBackground, getBounds, getBounds, getColorModel, getComponentOrientation, getCursor, getDropTarget, getFont, getFontMetrics, getForeground, getGraphics, getHeight, getInputMethodRequests, getLocation, getLocation, getLocationOnScreen, getName, getParent, getPeer, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside, isDisplayable, isDoubleBuffered, isEnabled, isFocusTraversable, isLightweight, isOpaque, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, removeComponentListener, removeFocusListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, repaint, requestFocus, reshape, resize, resize, setBackground, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setEnabled, setForeground, setLocale, setLocation, setLocation, setName, setSize, setSize, setVisible, show, size, toString, transferFocus

Mientras que de Object se heredan los mismos métodos:

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Algunos los analizaremos, mientras que para los demás os aconsejo consultar la documentación del JDK, en la que están descritas todas detalladamente.

El diagrama de las extensiones de Frame es el siguiente:



Llegados a este punto, se entiende por qué es importante la extensión de las clases en Java. Realmente en Frame se pueden invocar todos los métodos que analizamos antes.

En cambio, el método de JFrame de swing es:



Por lo tanto Jframe hereda todos lo métodos de Frame porque deriva de éste y, además, crea otros.


  Volver al inicio de la página