Programacion II
Programacion II
Sandoval Rivera 1
______________________________________________________________________
CAPITULO I: CONCEPTOS BÁSICOS
Objeto evento
• Evento: objeto que encapsula toda la información sobre la interacción del
usuario con la aplicación gráfica
– Presionar un botón
– Introducir un texto, etc.
• Una interacción del usuario puede producir uno o más eventos
• Jerarquía de eventos: raíz java.util.EventObject
Atributo: objeto fuente en el que se ha generado el evento
Método: Object getSource()
Objeto fuente
• Componente en el que se genera el evento
• Métodos de manejo de oyentes
– set<TipoEvento>Listener(): establece un único oyente para este tipo de
eventos
– add<TipoEvento>Listener(): añade el objeto a la lista de oyentes
– remove<TipoEvento>Listener(): elimina el objeto oyente correspondiente
Objeto oyente
• Gestiona, maneja o responde a un evento
• Define uno o varios métodos que son ejecutados por la fuente del evento y
reciben como argumento el objeto evento
• Los métodos a implementar se definen en la interfaz Java para los oyentes de
ese tipo de eventos: <TipoEvento>Listener (ej. ActionListener)
4.- MODELO-VISTA-CONTROLADOR
El Modelo Vista Controlador (MVC) es un patrón de arquitectura de software que
separa todo nuestra aplicación en tres componentes distintos:
La motivación bajo este patrón es la siguiente: no hacer que un único objeto sea
responsable del contenido, la apariencia y comportamiento.
Ejemplo
Pensemos en un campo de texto en el que hemos escrito la frase: En un lugar de la
Mancha, de cuyo nombre no.
El campo de texto puede tener un tamaño (en cuanto al número de caracteres que
puede mostrar) menor que la frase y en un momento dado puede mostrar lo
siguiente:
Una ventaja del patrón Model-View-Controller es que es posible tener varios view
de un mismo model.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 5
______________________________________________________________________
Ejemplo:
Podríamos realizar un componente cuyo contenido sean 3 matrices:
Una almacena las coordenadas x, otra las coordenadas y otra el valor de una función
z = f(x,y).
El controller trata los eventos relacionados con el usuario tal como pulsaciones del
ratón o pulsaciones de teclas.
Tiene que decidir si estos eventos se deben trasladar en cambios en el model o
cambios en el view.
Los patrones de diseño han de ser vistos como una guía, como una posible solución a
un problema y no como algo dogmático (que hay que aplicar de una forma
inmutable).
Por lo tanto, cada componente Swing tiene un modelo y un delegado asociado con el,
el modelo es responsable del estado y el delegado de la apariencia y comportamiento
(look and feel) así como de la comunicación entre el modelo y lo que se muestra.
Ejemplo:
La siguiente imagen representa gráficamente la interacción entre los diferentes
elementos de la aplicación, como son: modelo, vista y controlador aplicado a un
objeto de desplazamiento.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 6
______________________________________________________________________
Los IDE's ofrecen un ambiente gráfico en los que se tiene acceso a mayor número
de herramientas no ofrecidas en los JDK's: Debuggers más elaborados, check-points
dentro de la compilación, creación de WAR'S(Web-Archives), "Wizards" para
acelerar desarrollo, entre otras cosas. Algunos IDE'S son:
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 7
______________________________________________________________________
.- Visual Cafe de Symantec
La empresa Symantec, dura competidora en los IDE de Java ofrece el entorno
visual de desarrollo Java Visual Café, que ya goza de una gran reputación entre
los desarrolladores de Java.
.- Eclipse Open-Source
Eclipse es una plataforma de código abierto que se puede utilizar para diseñar
programas de primer nivel, componentes, sitios web y muchos otros elementos.
Con una cobertura integral de las funciones ampliadas de Eclipse 3.
• Sun One Studio ME (Se trata de una versión del entorno de Sun dedicado a
desarrollar aplicaciones J2ME. Este entorno, antes conocido como Forte for Java,
tiene el inconveniente de necesitar demasiados recursos, por lo que para utilizarlo
necesitaremos ordenadores con bastante memoria (no menos de 256Mb).
Con cada una de las versiones que Sun lanza del JDK, se acompaña de una serie de
bibliotecas con clases que se pueden incluir en los programas Java, sin temor a
fallos de portabilidad. Además, están bien documentadas, y organizadas en
paquetes y en un gran árbol de herencia.
A. Paquetes de utilidades
• java.applet: Para crear applets y clases que las applets utilizan para comunicarse
con su contexto. Se estudia en el capítulo "VI. Applets" de este tutorial.
• java.awt: Para crear interfaces con el usuario, y para dibujar imágenes y gráficos.
Se estudia en el capítulo "IV. Bibliotecas gráficas" de este tutorial.
• javax.swing: Conjunto de componentes gráficos que funcionan igual en todas las
plataformas que Java soporta. Se estudia en el capítulo "IV. Bibliotecas gráficas"
de este tutorial.
• javax.accesibility: Da soporte a clases de accesibilidad para personas
discapacitadas.
• java.beans: Para el desarrollo de JavaBeans.
Para que una nueva clase sea subclase de otra existente basta con añadir extends
existente a continuación del nombre de la nueva:
8. EVENTOS
Las acciones del usuario sobre el programa se llaman eventos. Son eventos típicos
el click sobre un botón, el hacer doble click sobre el nombre de un fichero para
abrirlo, el arrastrar un icono, el pulsar una tecla o combinación de teclas, el elegir
una opción de un menú, el escribir en una caja de texto, o simplemente mover el
ratón. Existen distintos tipos de eventos reconocidos por el sistema operativo y el
lenguaje de programación que los implementa.
Cada vez que se produce un evento sobre un determinado tipo de control, el
lenguaje de programación arranca una determinada función o procedimiento que
realiza la acción programada por el usuario para ese evento concreto. Estos
procedimientos o funciones se invocan de acuerdo a la implementación que realice
el lenguaje de programación que se esta utilizando.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 13
______________________________________________________________________
CAPITULO II: EL PAQUETE AWT
2.1. INTRODUCCION
AWT usa clases gráficas comunes a todos los sistemas operativos gráficos y luego
la máquina virtual traduce esa clase a la forma que tenga en el sistema concreto en
el que se ejecutó el programa, sin importar que dicho sistema sea un sistema X,
Macintosh o Windows.
Este paquete viene incluido en Java Foundation Classes (JFC) que es la API de
java y que se importa desde una aplicación como java.awt, con lo que las
interfaces generadas con esta biblioteca funcionan en todos los entornos java
disponibles.
AWT proporciona la base para trabajar con entornos gráficos en java, incluso el
paquete swing está basado en él.
• Los eventos (java.awt.Event), que nos indican las acciones del usuario.
La estructura básica del AWT podemos resumirla en los puntos que exponemos a
continuación:
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 14
______________________________________________________________________
• Los Contenedores contienen Componentes, que son los controles básicos
• No se usan posiciones fijas de los Componentes, sino que están situados a través
de una disposición controlada (layouts)
• El común denominador de más bajo nivel se acerca al teclado, ratón y manejo de
eventos
• Alto nivel de abstracción respecto al entorno de ventanas en que se ejecute la
aplicación
• La arquitectura de la aplicación es dependiente del entorno de ventanas, en vez
de tener un tamaño fijo.
• Es bastante dependiente de la máquina en que se ejecuta la aplicación (no puede
asumir que un diálogo tendrá el mismo tamaño en cada máquina)
2.3. COMPONENTES
2.4. CONTENEDORES
Los contenedores son clases que usan organizadores (layout manager) para
distribuir los objetos componentes en la superficie de despliegue de la mejor
forma.
Además, los contenedores son en sí mismos componentes y como tales pueden ser
situados dentro de otros contenedores. También contienen el código necesario para
el control de eventos, cambiar la forma del cursor o modificar el icono de la
aplicación.
Para aparecer en pantalla, todo componente GUI debe ser parte de una jerarquía de
contención. Una jerarquía de contención es un árbol de componentes que tiene un
contenedor de alto nivel como su raíz.
Existen otro tipo de contenedores que son más especializados, como los
paneles internos y los paneles de capas, que a su vez pueden
superponerse como:
Internal frames se parecen a los frames y tienen mucho del mismo API
pero al contrario que los frames deben aparecer dentro de otras
ventanas.
Root Panes proporcionan soporte detrás-de-la-escena a los
contenedores de alto nivel. Layered panes existen para soportar
ordenación en el eje Z de componentes
La siguiente tabla nos muestra los componentes del AWT y los eventos de
cada uno de ellos, así como una breve explicación de en qué consiste cada
tipo de evento.
Eventos
Componente Significado
generados
Button ActionEvent Hacer click en el botón
Checkbox ItemEvent Seleccionar o deseleccionar un item.
CheckboxMenuItem ItemEvent Seleccionar o deseleccionar un ítem.
Choice ItemEvent Seleccionar o deseleccionar un ítem.
Mover, cambiar tamaño, mostrar u
Component ComponentEvent
ocultar un componente.
FocusEvent Obtener o perder el focus.
KeyEvent Pulsar o soltar una tecla.
MouseEvent Pulsar o soltar un botón del ratón;
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 21
______________________________________________________________________
entrar o salir de un componente; mover
o arrastrar el ratón (tener en cuenta que
este evento tiene dos Listener).
Añadir o eliminar un componente de un
Container ContainerEvent
container.
Hacer doble click sobre un ítem de la
List ActionEvent
lista.
Seleccionar o deseleccionar un ítem de
ItemEvent
la lista.
MenuItem ActionEvent Seleccionar un item de un menú.
Scrollbar AdjustementEvent Cambiar el valor de la Scrollbar.
TextComponent TextEvent Cambiar el texto.
Terminar de editar un texto pulsando
TextField ActionEvent
Enter.
Acciones sobre una ventana: abrir,
Window WindowEvent
cerrar, restablecer e iniciar el cierre.
Se debe tomar en cuenta que los eventos propios de una super-clase pueden
afectar tambien a los componentes de sus sub-clases. Por ejemplo, la clase
TextArea no tiene ningun evento específico o propio, pero puede recibir los
de su super-clase TextComponent.
• BorderLayout: En cinco lugares: Norte, Sur, Este, Oeste y Centro (North, South,
East, West y Center).
• GridLayout: En una tabla en la que todas las casillas tienen el mismo tamaño.
• GridBagLayout: En una tabla, pero las casillas no tienen que tener el mismo
tamaño.
1
Con más detalle estos gestores de impresión así como los ejemplos se trataran capitulos siguientes de
este manual.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 22
______________________________________________________________________
Son todos hijos del evento ComponentEvent, que indica algún cambio en
un objeto Component:
Son todos hijos del evento AWTEvent, que es el evento base de la jerarquía
de eventos:
Para crear una aplicación utilizando AWT, se debe generar la interfaz de esa
aplicación, mostrando los distintos elementos del AWT y posteriormente realizar la
implementación de la funcionalidad de la aplicación.
Aunque no existen reglas que se deban seguir, éste manual trata de establecer una
secuencia para diseñar la aplicación:
Para crear una ventana principal así como los componentes de la aplicación, se
deben importar el paquete AWT de la siguiente manera:
import java.awt.*;
donde:
*, representa todas las clases del paquete AWT incluida la clase Frame.
import java.awt.*;
}
}
Cualquiera de las dos formas de crear una ventana principal nos
va a llevar a tener el siguiente resultado:
import java.awt.*;
Si tomamos como ejemplo: crear un botón, una etiqueta y una caja de texto
para mostrarlos en el marco creado anteriormente sería de la siguiente
forma:
import java.awt.*;
add(lblMensaje,BorderLayout.NORTH);
add(txtMensaje,BorderLayout.CENTER);
add(cmdOk,BorderLayout.SOUTH);
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 26
______________________________________________________________________
setTitle(t);
pack();
setVisible(true);
}
public static void main(String[] s)
{
demoVentana marco=new demoVentana("Principal");
}
}
2.8. Ejemplos
2
Debido a que SWING, mejora en gran parte las clases de AWT, los ejemplos de este manual se basan en
la utilización de clases de AWT y SWING, por lo tanto después de conocer SWING abundaremos con la
totalidad de ejemplos en este manual.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 27
______________________________________________________________________
3.1. Introducción
El paquete SWING es un conjunto de clases desarrolladas por primera vez para Java
1.2 (el llamado Java2), para mejorar el anterior paquete denominado AWT, debido
a que éste último presentaba muchas limitaciones a la hora de construir
aplicaciones.
Tanto Swing como AWT forman parte de una colección de clases llamada JFC,
que incluyen paquetes dedicados a la programación de interfaces gráficos (así
como a la producción multimedia).
Swing aporta muchas más clases, consume menos recursos y construye mejor la
apariencia de los programas. En cualquier caso, AWT no desaparece; simplemente
se añade a las nuevas capacidades Swing
Todas las clases de Swing son parte del paquete javax.swing, para poder utilizar
una clase de Swing se tiene que importar la clase de la siguiente manera:
import javax.swing.*;
A pesar de que Swing tiene un estilo visual propio por defecto, puede también
utilizar un aspecto “Motif”, “Windows” o “Apple”; estos últimos sólo en las
plataformas correspondientes. Además puede cambiar de aspecto en tiempo de
ejecución
Metal Mac Os
Motif Windows
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 28
______________________________________________________________________
Todos estos objetos se agrupan en una estructura de tipo árbol que nos indica que
objeto contiene otro objeto y que por lo general presenta todo programa típico que
usa este paquete Swing.
• javax.swing
• javax.swing.border (bordes)
• javax.swing.colochooser (elección de color)
• javax.swing.event (eventos)
• javax.swing.filechooser (elección de archivos)
• javax.swing.plaf (pluggable look-and-feel
• javax.swing.plaf.basic (base look-and-feel)
• javax.swing.metal (look-and-feel defecto)
• javax.swing.multi (mezclar look-and-feel)
• javax.swing.table (tablas)
• javax.swing.text (documentos)
• javax.swing.text.html (soporte edición html)
• javax.swing.text.html.parser (análisi html)
• javax.swing.text.rtf (soporte documentos RTF)
• javax.swing.tree (soporte representación de árbol)
• javax.swing.undo
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 30
______________________________________________________________________
3.5. COMPONENTES Y CONTENEDORES
3.5.1. Componentes
Los componentes son los elementos básicos de la programación con Swing.
Todo lo que se ve en un GUI de Java es un componente.
Los componentes se colocan en otros elementos llamados contenedores que
sirven para agrupar componentes. Un administrador de diseño se encarga
de de disponer la presentación de los componentes en un dispositivo de
presentación concreto, swing posee alrededor de 250 componentes que
cada vez se incrementan.
Propiedad text
• Métodos
Los métodos proporcionan el comportamiento de un componente, ya que
obligan al componente a realizar una acción
Ejemplo:
El método setText modifica el texto de un objeto JTextArea denominado
jTextArea1
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 31
______________________________________________________________________
• Eventos
Un evento es una señal o acción, externa o interna a la aplicación, que
produce la ejecución de un bloque de código que se escribe como un
método.
Ejemplos
o Pulsar el mouse
o Llamar a un método
o Modificar el valor de una propiedad
Ejemplo:
3.5.2. Contenedores
3
Todo los conceptos sobre componentes y contenedores se trató con detalle en la descripción del paquete
AWT, como SWING es una mejora de AWT, los conceptos se aplican igual para ambos paquetes.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 32
______________________________________________________________________
Swing propone una jerarquía de contenedores de componentes. Cualquier
aplicación que utilice Swing debe tener un contenedor de alto nivel y uno o
más contenedores intermedios y componentes atómicos.
Todos los componentes del paquete swing presentas las propiedades siguientes que
son heredadas por todas las clases que derivan de la clase Component.
3.7.1. Contenedores
3.7.1.1. JFrame
Representa una ventana básica, capaz de contener otros
componentes. Casi todas las aplicaciones construyen al menos un
JFrame, es dependiente del escritorio y posee decoración, icono, y
controles
Constructores:
JFrame(String); // titulo
Propiedades y métodos:
.- Dimension dim = getToolkit().getScreenSize(); Tamaño
pantalla:
.- setSize(int, int); // Tamaño de ventana
.- setLocation(int_x; int_y); // Ubicación de ventana
.- setVisible(boolean); // Mostrar ventana
.- pack(); // colocar
.- add(Component...); // agregar componentes
.- setIconImage(ImageIcon); // modificar imagen
Creación de Marco
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 34
______________________________________________________________________
import javax.swing.*;
public class Ventana {
Resultado:
3.7.1.2. JDialog
Es un componente o ventana auxiliar que sirve para presentar
diálogos cuando se registra un evento dentro de un programa,
pueden ser modales o no modales, esto quiere decir que si son
modales la ventana del diálogo bloquea las entradas a otras
ventanas, este tipo de diálogos se pueden hacer también con
JOptionPane
Constructores
JDialog(JFrame, String, boolean) //ventana padre, título y modo
JDialog() //ventana
JDialog(Frame) //ventana padre
JDialog(Frame, boolean) //ventana padre y modo
JDialog(Frame, String) //ventana padre y título
Propiedades y métodos
Ejemplo
JDialog dialogo;
JFrame credi;
credi=new JFrame();
Resultado
3.7.1.3. JPanel
Es un contenedor de propósito general para componentes de peso
ligero., utiliza un controlador de distribución para posicionar y
dimensionar sus componentes. Un objeto JPanel permite añadirle
bordes y determinar si utiliza el doble buffer para aumentar el
rendimiento. Tiene su controlador de distribución por defecto que
es FlowLayout.
Constructores
JPanel()
JPanel(boolean) //Determina estrategia de buffer: trae doble
buffer
JPanel(LayoutManager) //porporciona controlador distribución
JPanel(LayoutManager, boolean)
Propiedades y métodos
void add(Component) //Añade el componente al panel.
int getComponentCount() //obtiene nº de componentes de panel
Component getComponent(int) //obtiene componente basándose
en su índice
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 36
______________________________________________________________________
Ejemplo
getContentPane().add(panel,BorderLayout.CENTER);
setSize(200,150);
setVisible(true);
Resultado
3.7.2.1. JLabel
Objeto que permite situar un texto y/o
imagen no seleccionable en una línea,
generalmente usado para identificar
otros elementos widgets. Estos objetos
no tienen ningún tipo de interacción
con el usuario.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 37
______________________________________________________________________
Constructores:
JLabel(String text)
JLabel(Icon icon)
JLabel(String text, int alin_hor)
JLabel(Icon icon, int alin_hor)
Propiedades y métodos
String texto;
Icon icono;
int horizontalAlignment
Métodos
setText(String s);
String getText();
setIcon(new ImageIcon(“fich.gif"));
setHorizontalAlignment(int); // LEFT, CENTER, RIGHT
setVerticalAlignment(int); // TOP, CENTER, BOTTON
3.7.2.2. ImageIcon
Implementa la clase abstracta Icon, visualiza imágenes .jpg/.gif
que deben estar ubicadas en el mismo directorio de la aplicación.
Componentes: setIcon
Constructores:
ImageIcon(String Fichero);
Propiedades
String texto;
Icon icono;
int horizontalAlignment
Métodos
setImage(String fichero);
Image getImage();
Ejemplo
3.7.3. Botones
Son componentes para capturar eventos generados por el usuario (por
pulsación).
• Pueden representar texto y/o iconos.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 38
______________________________________________________________________
• La clase DefaultButtonModel define el estado del botón
• Se pueden agrupar (ButtonGroup)
3.7.3.1. DefaultButtonModel
Propiedades de los diferentes tipos de botones controlados por la
clase DefaultButtonModel
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 39
______________________________________________________________________
3.7.3.2. JButton
Objeto de control de pulsación de tipo widget que permiten al
usuario comenzar un evento, como buscar, aceptar una tarea,
interactuar con un cuadro de diálogo, etc.
Un botón se presiona haciendo clic sobre el mismo, o al presionar
Enter si está seleccionado. También suele poder presionarse con
alguna tecla o combinación de teclas.
Los botones más comunes, especialmente en los cuadros de
diálogos y formularios son:
Constructores
JButton(String text)
JButton(Icon icon)
JButton(String text, Icon icon)
Propiedades
String texto;
Icon icono;
int mnemonic;
Métodos
setText(String);
setIcon(Icon);
setRolloverIcon(Icon); // muestra al estar encima del botón
setDisabledSelectedIcon()
setPressedIcon()
Ejemplo
3.7.3.3. JToggleButton
Botón con proporciona el estado en un momento determinado
(seleccionado/deseleccionado)
Un ejemplo de esto, son los botones de Negrita, Cursiva,
Subrayado en los editores de texto comunes.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 40
______________________________________________________________________
Existen dos tipos de botones que se extiende de esta clase tal
como lo muestra la figura siguiente:
Constructores
JToggleButton(String text)
JToggleButton(Icon icon)
JToggleButton(Icon icon, boolean selected);
Propiedades y métodos
bool getSelected()
void setSelected (bool)
ItemEvent.SELECTED
ItemEvent.DESELECTED
Constructores
JCheckBox/JRadioButton(String text [, boolean selec])
JCheckBox /JRadioButton(Icon icon [, boolean selec])
JCheckBox /JRadioButton(String text, Icon icon [, boolean selec])
Propiedades
String texto;
Icon icono;
int mnemonico
boolean selec
Métodos
setText(String);
setIcon(Icon);
boolean isSelected()
setSelected(boolean b)
Constructor
ButtonGroup()
Propiedades
String texto;
Icon icono;
int mnemonico
boolean selec
Métodos
add/remove(AbstractButton); // añade/quita botones
setSelected(ButtonModel m, boolean b);
boolean isSelected(ButtonModel m); // comprueba si está
seleccionado botón
int getButtonCount(); // número de botones
Ejemplo
3.7.4. Rangos
Son componentes para obtener un valor dentro de un rango
La clase DefaultBoundedRangeModel define el estado del Componente
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 43
______________________________________________________________________
3.7.4.1. DefaultBoundedRangeModel
Clase que define el estado (modelo) del componente.
3.7.4.2. JScrollBar
Componentes para obtener un valor dentro de un rango
Constructores
JScrollBar()
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 44
______________________________________________________________________
Propiedades
String texto;
Icon icono;
int mnemonic;
boolean selecc;
3.7.4.3. JProgressBar
Descripción
Barra para medir el progreso (grado de acabado) de un suceso
Constructores
JProgressBar( ) // Barra progreso horizontal
JProgressBar(int orient, int min, int max)
JProgressBar(int min, int max)
JProgressBar(int orient)
Propiedades
int orientation; // JProgressBar.HORIZONTAL|VERTICAL
setString(String s); // mostrar en el progreso
setStringPainted(boolean b);
Ejemplo
JProgressBar pbar;
pbar.setMinimum(0);
pbar.setMaximum(100);
pbar.value(35);
pbar.setString(“35%”);
pbar.setStringPainted(true);
Resultado
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 45
______________________________________________________________________
3.7.4.4. JSlider
Barra para medir el valor en un rango, permite introducir un valor
numérico entre un máximo y un mínimo de manera rápida.
Constructores
JSlider();
JSlider(int orientation)
JSlider(int min, int max);
JSlider(int min, int max, int value);
JSlider(int orientation, int min, int max, int value);
Propiedades y Metodos
int orientation; // JSlider.HORIZONTAL|VERTICAL
setMajorTickSpacing(int n ) // marca cada n valores
setMinorTickSpacing(int n ) // distancia de marcas pequeñas
setPaintTicks( boolean ) // dibujar las marcas
setValue(int) // Valor del deslizador
setPaintLabels (boolean) // mostrar etiquetas
Ejemplo
JSlider s;
s.setMinimum(0); s.setMaximum(20);
s.setValue(4);
s.setMajorTickSpacing(5);
s.setMinorTickSpacing(1);
s.setPaintTicks(true);
s.setPaintLabels(true);
Resultado
3.7.5. Texto
Aquí podemos ver una imagen que muestra cada uno de los componentes
de texto Swing
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 46
______________________________________________________________________
Constructores
JTextField();
JTextField(String, int); // nº columnas
JTextField(String);
Propiedades
text, editable, columns
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 47
______________________________________________________________________
Métodos
setText(String);
setColumns(int) // nº columnas
setEditable(boolean editable)
3.7.5.2. JPasswordField
JPasswordField es una subclase de JTextField que, en vez de
mostrar el caracter real tecleado por el usuario, muestra otro
caracter como un asterisco '*'. Este tipo de campo es útil para
pedir al usuario que introduzca passwords cuando se conecta o
para validar su identidad.
Constructores
JPasswordField();
JPasswordField(String, int);// nº columnas
TextField(String);
Métodos
setPassword(String);
setEchoChar(char) // carácter
setColumns(int) // nº columnas
boolean echoCharIsSet();
3.7.5.3. JTextArea
Es el único componente de texto plano, que puede mostrar y editar
múltiples líneas de texto.
En este objeto se puede utilizar setText y getText para recuperar o
modificar el contenido del componente en una simple llamada al
método.
Constructores
JTextArea(String t, int n_fila, int n_col);
JTextArea(int n_fila, int n_col);
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 48
______________________________________________________________________
Propiedades
text, editable, columns, rows
lineCount
Métodos
setText(String);
String getSelectedText();
insert(String s, int pos); // inserta texto en pos.
replaceRange(String s, int inicio, int fin) // sustituye texto en el
rango
append(String s); // añade al final.
3.7.6. Elección
Componentes que permiten elegir una opción entre una serie de alternativas
• Se permite selección simple/múltiple
• El modo de selección múltiple depende del Look&Feel (Shift, Crtl...)
Componentes como:
• JList
• JComboBox
3.5.7.1. JList
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 49
______________________________________________________________________
Consta de tres partes: Modelo de datos (ListModel) Modelo de
selección (ListSelectionModel) y Modelo de representación
(ListCellRenderer)
Descripción:
• Lista de elementos (para selección)
• Admite diferentes modos de selección
• No dispone de barra de desplazamiento (scroll) automáticamente
(se debe insertar en un panel JScrollPane
• Listas sencillas (tamaño fijo) o variables (ListModel)
Constructores:
JList (Octect[] elementos); // array de (String) elementos para
visualizar
JList (ListModel modelo); // modelo de datos complejos
Propiedades y Métodos
String texto;
Icon icono;
int modo; // SINGLE_SELECTION,
// SINGLE INTERVAL_SELECTION,
//MULTIPLE_INTERVAL_SELECTION
void setVisibleRowCount (int filas); // columnas visibles
void setSelectionMode(int modo); // modo selección
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 50
______________________________________________________________________
asad
s
3.5.7.2. ListModel/DefaultListModel
Descripción:
• Lista de elementos (para selección)
• Adecuado para: listas largas, cambiantes, de objetos, etc.
• Control para el manejo de la lista (Interfaz ListModel)
• Existe una implementación predefinida (DefaultListModel)
Constructor:
void addElement(object o); // añade elemento al final de la lista
void removeElement(object o); // elimina la primera ocurrencia
del objeto en la lista
removeAllElements();
Propiedades y métodos
String texto;
Icon icono;
int modo; // SINGLE_SELECTION,
// SINGLE INTERVAL_SELECTION,
MULTIPLE_INTERVAL_SELECTION
Ejemplo
3.5.7.3. JComboBox
Descripción
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 51
______________________________________________________________________
Objeto que combina entrada de texto con una lista desplegable,
permite seleccionar una opción entre varias posibles, el primer
elemento aparece como seleccionado (índice 0)
Descripción:
• Combinación de entrada de texto con lista desplegable
• Posee ScrollBar automático
• El primer elemento aparece como seleccionado (índice 0)
Constructor
public JComboBox();
public JComboBox(ComboBoxModel aModel);
public JComboBox(Object items[]); //array de elementos
Propiedades y métodos
int getSelectedItem(); // selección actual
void setMaximumRowCount( int n ) // número de elementos a
mostrar en el combo
int getItemCount(); // contabilizar nº de elementos
void setEditable(boolean ); // si permite realizar cambios en la
lista
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 52
______________________________________________________________________
Descripción:
• Modelo para representar los datos de un JComboBox
• Permite edición
Constructores:
public DefaultComboBoxModel( );
public JComboBox(Vector items);
Métodos
void addElement(object o); // añade elemento al final de la lista
public void insertElementAt(Object obj, int index); // en una
posición
void removeElement(object o); // elimina la primera ocurrencia
del objeto en la lista
removeAllElements();
Ejemplo
3.5.8.1. JOptionPane
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 53
______________________________________________________________________
Clase que contiene métodos estáticos para crear distintos tipos de
diálogos modales.
Cuando un dialogo modal es visible, bloquea las entradas del
usuario en todas las otras ventanas del programa.
Con parámetros: padre, mensaje, titulo, tipo de opción
(ERROR_MESSAGE,…), tipo de mensaje
(OK_CANCEL_OPTION, YES_NO_OPTION, ……), ícono a
utilizar y opciones.
Para la mayoría de los diálogos modales sencillos, se crea y se
muestra el diálogo utilizando uno de los métodos showXxxDialog
de JOptionPane
Constructores
JOptionPane()
JOptionPane(Object)
JOptionPane(Object, int)
JOptionPane(Object, int, int)
JOptionPane(Object, int, int, Icon)
Métodos
showConfirmDialog(…)
Muestra un diálogo modal con dos botones, etiquetados "Yes" y
"No". Estas etiquetas no son siempre terriblemente descriptivas
con las acciones específicas del programa que causan.
showInputDialog(….)
Muestra un diálogo modal que obtiene una cadena del usuario. Un
diálogo de entrada muestra un campo de texto para que el usuario
teclee en él, o un ComboBox no editable, desde el que el usuario
puede elegir una de entre varias cadenas
showMessageDialog(…. )
Muestra un diálogo modal con un botón, etiquetado "OK". Se
puede especificar fácilmente el mensaje, el icono y el título que
mostrará el diálogo.
showOptionDialog(…)
Muestra un diálogo modal con los botones, los iconos, el mensaje
y el título especificado, etc. Con este método, podemos cambiar el
texto que aparece en los botones de los diálogos estándard.
También podemos realizar cualquier tipo de personalización
3.5.8.2. JFileChooser
Elemento para seleccionar archivos, incluye métodos para mostrar
dialogo de selección.
Coinstructor
JFileChooser( )
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 54
______________________________________________________________________
Propiedades y métodos
showOpenDialog(JFileChooser )
getSelectedFile()
3.5.8.3. JColorChooser
3.5.8.4. JSplitPane
Constructores
JSplitPane() //crea un SplitPane
JSplitPane(int) //int indica orientación
HORIZONTAL_SPLIT o
VERTICAL_SPLIT
JSplitPane(int, boolean) // booleano selecciona si los componentes
se redibujan continuamente cuando el
usuario arrastra el divisor.
JSplitPane(int, Component, Component) // Los parámetros
Component seleccionan los componentes izquierdo y derecho o
superior e inferior, respectivamente.
JSplitPane(int, boolean, Component, Component)
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 55
______________________________________________________________________
Propiedades y métodos
void setOrientation(int) // selecciona la orientación del SplitPane
puede ser HORIZONTAL_SPLIT o
VERTICAL_SPLIT
void setDividerSize(int) //selecciona tamaño de divisor en pixeles
setOneTouchExpandable(boolean) // selecciona si el SplitPane
muestra los botones de control expandibles
void setTopComponent(Component) //selecciona el componente
indicado
void setBottomComponent(Component)
void setLeftComponent(Component)
void remove(Component) //elimina componente
void removeAll() //elimina todos los componentes
void add(Component) // agrega un componente
void setDividerLocation(double)
3.5.8.5. JTabbedPane
Descripción
Con la clase JTabbedPane, podemos tener varios componentes
(normalmente objetos JPanel) compartiendo el mismo espacio. El
usuario puede elegir qué componente ver seleccionando la pestaña
del componente deseado.
Constructores
JTabbedPane() //crea un TabbedPaned
JTabbedPane(int) // crea un TabbedPane con orientación de las
pestañas de acuerdo a los valores TOP, BOTTOM, LEFT, LEFT.
Propiedades y métodos
3.5.8.6. JToolBar
Es un objeto contenedor que permite agrupar otros componentes
normalmente botones con iconos en una fila o columna
Las barras de herramientas tienen la particularidad de que el
usuario puede situarlas en distintas configuraciones sobre el frame
principal
Constructores
JToolBar() // crea una barra de herramientas
Propiedades y métodos
3.5.8.7 JInternalFrame
Con la clase JInternalFrame, se puede mostrar un JFrame, como
una ventana dentro de otra ventana. Para crear un frame interno
que parezca un diálogo sencillo, se pueden utilizar los métodos
showInternalXxxDialog de JOptionPane.
Normalmente, los frames internos se muestran dentro de un
JDesktopPane que es una subclase de JLayeredPane al que se le
ha añadido el API para manejar el solapamiento de múltiples
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 57
______________________________________________________________________
frames internos. Generalmente, se pone el panel superior dentro
del panel de contenido de un JFrame.
Constructores
JInternalFrame()
JInternalFrame(String)
JInternalFrame(String, boolean)
JInternalFrame(String, boolean,boolean)
JInternalFrame(String, boolean,boolean, boolean)
JInternalFrame(String, boolean,boolean, boolean, boolean)
void setContentPane(Container)
Container getContentPane()
void setMenuBar(JMenuBar)
void pack()
void setDefaultCloseOperation(int) // Selecciona lo
que hace el frame interno cuando el usuario intenta "cerrar" el
frame. El valor por defecto es HIDE_ON_CLOSE. Otros
posibles valores son DO_NOTHING_ON_CLOSE y
DISPOSE_ON_CLOSE.
void addInternalFrameListener(InternalFrameListener)
void moveToFront()
void moveToBack()
void setClosed(boolean)
boolean isClosed()
void setMaximum(boolean)
3.5.8.8. JToolTip.
Consiste en una etiqueta de ayuda que surge al cabo de uno
segundos sobre la posición apuntada por el cursor. Normalmente
no es necesario utilizar directamente la clase JToolTip, se puede
establecer para cualquier componente de la ventana mediante:
e.setToolTipText (“Ésta es la etiqueta”).
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 58
______________________________________________________________________
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 59
______________________________________________________________________
CAPITULO III APLICACIONES
3.1. INTRODUCCION
En este capitulo vamos a proporcionar ejemplos que van desde casos simples hasta
casos de mediana complejidad.
Asimismo se combinan el uso de los paquetes AWT y SWING de tal manera que
les sirva de guía durante la creación de los programas que ustedes diseñen.
Sin embargo, al cerrar este JFrame la aplicación no termina. Esto ocurre porque es
necesario asociar la acción de cerrar el JFrame con la finalización de la aplicación
podemos realizar esta asociación mediante la operación
setDefaultCloseOperation() con su argumento constante EXIT_ON_CLOSE de la
clase JFrame.
import javax.swing.*;
import javax.swing.*;
public Marco1( ) {
setTitle("Prueba");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200,300);
setVisible(true);
}
En este caso se crea la ventana aplicando herencia, donde las propiedades de la ventana
se definen en el método constructor de la clase, de tal manera que cuando se crea el
objeto ventana se aplican las propiedades incluidas en el método constructor.
Otras propiedades que pueden ser modificadas a través de los siguientes métodos:
.- setLocation(100,100);
Este método ubica la ventana de acuerdo a la siguiente estructura:
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).
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 61
______________________________________________________________________
3.3. Añadir Componentes a una Ventana
La estructura de la ventana o JFrame
esta compuesta por capas tal como lo
muestra la figura:
.- getContentPane
.- setContentPane
import javax.swing.*;
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
3.4.1. BorderLayout
Se puede utilizar para colocar en un contenedor cinco componentes como
máximo ya que proporciona cinco posiciones donde colocar los
componentes, estas son:
• NORTH (arriba). • EAST (derecha)
• SOUTH (abajo) • CENTER (en el centro).
• WEST (izquierda)
Ejemplo
Crear una ventana con 5 botones y se colocan en cada posición que este
gestor proporciona.
import java.awt.*;
import javax.swing.*;
public panel() {
Container c = getContentPane();
b1=new JButton("Norte");
b2=new JButton("Sur");
b3=new JButton("Este");
b4=new JButton("Oeste");
b5=new JButton("Centro");
//Propiedades de la ventana
setTitle("Gestor BorderLayout");
setSize(400,250);
setVisible(true);
}
public static void main (String[] args){
panel t= new panel();
}
}
3.4.2. FlowLayout
import java.awt.*;
import javax.swing.*;
public panel() {
Container c = getContentPane();
c.setLayout(new FlowLayout());
b1=new JButton("Primero");
b2=new JButton("Segundo");
b3=new JButton("Tercero");
b4=new JButton("Cuarto");
b5=new JButton("Quinto");
setTitle("Gestor FlowLayout");
pack();
setVisible(true);
}
public static void main (String[] args){
panel t= new panel();
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 65
______________________________________________________________________
}
}
3.4.3. GridLayout:
Coloca los componentes del mismo tamaño y los coloca en filas y
columnas en función de los valores pasados al constructor.
Ejemplo, para este ejemplo se modifica el gestor de diseño del JFrame por
el gestor GridLayout que ubica los 4 botones en 2 filas y 2 columnas y
además define con valor 5 la distancia tanto vertical como horizontal entre
los botones que son los dos últimos argumentos del objeto GridLayout.
import java.awt.*;
import javax.swing.*;
public panel() {
Container c = getContentPane();
c.setLayout(new GridLayout(2,2, 5,5));
b1=new JButton("Primero");
b2=new JButton("Segundo");
b3=new JButton("Tercero");
b4=new JButton("Cuarto");
setTitle("Gestor GridLayout");
pack();
setVisible(true);
}
}
}
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 66
______________________________________________________________________
3.4.4. BoxLayout
Este gestor de distribución organiza los componentes horizontal o
verticalmente, ajustando los componentes al espacio disponible
import java.awt.*;
import javax.swing.*;
setTitle("Gestor BoxLayout");
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 67
______________________________________________________________________
}
3.4.5. GridBagLayout
Ejemplo
Vamos a construir una ventana en la que situamos determinados
componentes (botones) en determinadas posiciones.
La ventana que pretendemos obtener es la de la siguiente figura:
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 68
______________________________________________________________________
Tiene un área de texto que ocupa casi toda la ventana. Un "Boton 1" en la
parte superior derecha, un "Boton 2" en la derecha hacia el medio, el
"Boton 3" en la equina inferior izquierda, el "Boton 4" en la esquina
inferior derecha y un campo de texto entre estos dos últimos botones.
Luego, sobre el dibujo, hay que trazar unas lineas horizontales y verticales,
para tratar de delimitar una rejilla en la que iran colocados los botones. Para
trazar esta rejilla y que luego el código no nos salga muy complicado
conviene tener en cuenta lo siguiente:
Estas líneas son casi obligadas, puesto que el boton 3, el campo de texto y
el boton 4 nos las limitan. No importa que una de ellas pase por enmedio
del area de texto, símplemente haremos que esta ocupe dos columnas. Estas
líneas nos limitan tres columnas que hemos numerado como 0, 1 y 2.
Como hemos dicho, la segunda puede pasar por cualquier lado entre los dos
botones. Para que no se nos complique el código y según dijimos arriba,
cogiendo la segunda línea pegando por arriba al botón 2 (como hemos
hecho en el dibujo), ya tenemos al boton 2 ocupando la parte superior de su
celda. También podíamos haberla pegado al botón 1, así el botón 2 estaría
más o menos en el centro de su celda. Lo que complicaría luego el código
sería poner la línea entre ambos botones, por lo que el boton 2 quedaría a
1/3 de la parte superior de su celda.
Resumiendo, nuestro area de texto ocupa cuatro celdas, los botones una
cada uno y el campo de texto otra. Boton 1 y 2 no ocupan toda la celda,
pero están en la parte superior de la misma.
Por ello es acosejable poner siempre todos los atributos. Otra opción es
hacer un new GridBagConstraints para cada componente (claramente
menos eficiente) o finalmente la que he seguido en el código de ejemplo,
ser muy cuidadoso e ir restaurando valores según se van cambiando.
Las filas son de la altura justa para contener a los botones. Las columnas
también. El área de texto que ocupa cuatro celdas se ha situado en el medio
de ellas y le sobra un montón de espacio.
El siguiente paso a dar consiste en decir cómo se deben estirar las filas
columnas. Si comparamos con la figura en las que marcamos inicialmente
las filas y columnas, vemos que las dos primeras filas deben ser más
anchas, la tercera fila ya está bien de ancho. En cuanto a las columnas, la
segunda es la que debe estirarse, la primera y tercera están bien.
A estos campos debemos darles el valor 0.0 (que es el valor por defecto) si
no queremos que la fila o columna se estire. Este es el caso para la primera
y tercera columna, así como para la tercera fila. Debemos dar el valor 1.0 a
las filas o columnas que queremos que se estiren hasta completar toda la
ventana. Es el caso de las dos primeras filas y de la columna del medio.
Hay dos detalles con estos campos. El primero es que widthy afecta a una
fila completa, no solo a un componente. Por ello, cada vez que añadamos
un componente a esa fila, debemos dar a widthy el mismo valor (o 0.0 o
1.0). Lo mismo pasa con widthx y las columnas. El segundo detalle es el
que comentamos antes, sólo estamos usando una instancia de
GridBagConstraints, asi que después de poner uno de estos campos a 1.0 y
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 74
______________________________________________________________________
añadir un componente, debemos volver a ponerlo a 0.0 para el siguiente
(suponiendo que sea eso lo que necesita).
¿Qué es lo que ha pasado ahora?. Le hemos dicho que estire las filas y
columnas y es lo que ha hecho, pero como no le hemos dicho nada sobre
los componentes, no los ha estirado en absoluto.
Los camos weightx y weighty, como hemos visto, hace que se estiren las
filas y columnas. Hemos puesto 0.0 para las que no se estiran y 1.0 para las
que sí. En realidad cada fila o columna se estira en proporción al valor de
este campo respecto a los demás. Por ejemplo, si a la columna 1 le
ponemos weightx=1.0 y a la 2 le ponemos weightx=0.5, ambas se estirarían
, pero la primera el doble que la segunda.
Hay campos insets, ipadx e ipady que permiten fijar márgenes entre los
componentes, de forma que no queden pegados entre sí.
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 79
______________________________________________________________________
3.5. Look And Feel
Java utiliza el interfaz gráfico de la plataforma sobre la que se está ejecutando para
presentar los Componentes del AWT con el aspecto asociado a esa plataforma, de
este modo los programas que se ejecuten en Windows tendran esa apariencia y los
que se ejecuten en Unix tendrán apariencia Motif.
Java incorpora su propio Look&Feel por defecto, cuyo nombre es Metal, y que se
muestra a continuación.
import javax.swing.UIManager;
...
try
{
Universidad Nacional de Piura – Jorge L.Sandoval Rivera 81
______________________________________________________________________
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClass
Name());
}
catch (Exception e)
{
e.printStackTrace();
}
3.5.2. Cómo crear interfaces gráficas con Look And Feel en Java
Java Look And Feel (de ahora en adelante J&F) es un API multiplataforma
proporcionada por JavaSoft. .Java L&F implementa todas las
funcionalidades básicas de Swing, pero tambén se extiende en otras áreas
incluyendo:
o Temas
o Sliders (barras de selección de rangos)
o Toolbars (Barras de herramientas)
o Trees (arboles de contenido)
Esto es muy sencillo de hacer. Lo único que tenemos que hacer es activar el
Look And Feel, pasando true como parámetro al método estático
setDefaultLookAndFeelDecorated de JFrame y de JDialog. Por ej.:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
boton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JOptionPane.showMessageDialog(null,
"Y así se ve un cuadro de dialogo de error",
"Mensaje",JOptionPane.ERROR_MESSAGE);
}
}
);
getContentPane().add(new JLabel("Asi se ve un Frame"),
BorderLayout.NORTH);
getContentPane().add(boton);
setSize(200,80);
setVisible(true);
}
public static void main(String args[])
{
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
Ejemplo1Look ventana = new Ejemplo1Look();
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
java.lang.Object
java.util.EventObject
awt.event
KeyEvent MouseEvent
e) Adaptadores
Para las interfaces con más de una operación Swing proporciona por
comodidad una clase adaptadora (adapter classes), que tienen como
objetivo evitar la tediosa tarea de tener que implementar todos los
métodos de las interfaces listener.
Por ello existe una clase adaptadora por cada interface listener que tiene
más de un método: MouseAdapter, WindowAdapter, KeyAdapter,
MouseMotionAdapter, FocusAdapter, ContainerAdapter y
ComponentAdapter,
etc.
La clase adaptadora correspondiente se obtiene sustituyendo “Listener”
por “Adapter”
CAPITULO IV APPLETS
4.1. INTRODUCCION
Un applet está formado por una clase o conjunto de clases escritas en java que está
insertado en una pagina Web.
Cuando un usuario carga la página en la que esta el applet, éste se ejecuta localmente (en
la maquina cliente donde se esta ejecutando el navegador Web.) y no remotamente (sobre
el sistema que está ejecutando el servidor HTTP).
El hecho de que el código se ejecute localmente implica que la seguridad sea crucial, los
applets están sometidos a restricciones de seguridad por defecto. Por ejemplo nadie desea
que un applet cargado visitando una página Web borre sus archivos. O que ese applet
realice conexiones a otras máquinas para transferir información.
Estas están impuestas por un objeto del tipo SecurityManager en el sistema cliente que
especifica que acciones están permitidas y cuales no.
A partir de la versión 1.1. de la plataforma java, las clases se pueden firmar digitalmente,
estas clases pueden realizar acciones no permitidas a las clases no firmadas.
Por defecto, el gestor de seguridad de los navegadores verifica entre otras cosas que los
applets:
• No puedan leer los archivos locales
• No puedan escribir en los discos locales
• No puedan establecer conexioes a otras máquinas salvo con el servidor que
contiene el applet
• No ejecutar programas locales
• No puedan obtener información privada sobre el usuario.
Hay que
init( ) start() redibujar el
applet
Se carga la paint()
página que
contiene el
applet