Introducción al lenguaje JAVA - Creación de applets sencillos

9 - Creación de applets sencillos

[editar]
Curso gratis creado por Unav. Extraido de: http://www.unav.es/cti
21 de Septiembre de 2005
  • Se incrustan en las paginas web
  • Se cargan dinamicamente de la red
  • Son programas, luego problema de seguridad: restricciones
  • Un applet no puede cargar librerias o definir metodos nativos (programas en C por ejemplo)
  • Como norma general no puede leer ni escribir ficheros en el ordenador en que se ejecuta. Si es necesario, se pueden escribir en el HD del ordenador host.
  • No puede conectarse por red excepto al host del cual se cargo el applet
  • No puede ejecutar ningun programa en el ordenador local
  • No pueden lanzar programas en el equipo local
  • Se supone que hay seguridad total, pero algun listillo podria desbaratarla... Sun desafió a los hackers!
  • Un applet puede invocar metodos de otros applets que residan en la misma pagina
  • Los applets cargados desde el sistema local (desde un directorio definido en CLASSPATH) no tienen, por defecto, ninguna de las restricciones de los applets cargados desde la red
  • Se pueden leer algunas caracteristicas del sistema local;

Permitidas
Key                            Meaning
"file.separator"           File separator (for example, "/")
"java.class.version"    Java class version number
"java.vendor"             Java vendor-specific string
"java.vendor.url"        Java vendor URL
"java.version"            Java version number
"line.separator"          Line separator
"os.arch"                   Operating system architecture
"os.name"                 Operating system name
"path.separator"         Path separator (for example, ":")
 
Ejemplo de uso: String s = System.getProperty("os.name");
 
No permitidas
Key                             Meaning
"java.class.path"          Java classpath
"java.home"                Java installation directory
"user.dir"                    User's current working directory
"user.home"                User home directory
"user.name"                User account name
 
  • Cada N crea un objeto de la clase SecurityManager
  • Se puede definir que restricciones se le aplican al applet. Si se violan, se produce una excepcion, que el programador puede tratar ("vaya, aqui no me dejan leer de disco")
  • Algunos applets paran su ejecucion al salir de la pagina, pero otros continuan
  • Subclase de java.applet.Applet: por tanto hereda los metodos y clases para manipular graficos, sonidos, etc...
  • PUBLIC class miclase extends java.applet.Applet: solo la clase principal debe ser publica por fuerza
  • A diferencia de las aplicaciones main(), applets son algo mas complicados. Fases en la vida de un applet;
  • Public void init() {...}:
    Ocurre cuando se carga por 1º vez el applet o al recargar. Crea objetos, estado inicial, carga imagenes o fuentes. Solo ocurre 1 vez en la vida de un applet.
    • Public void start() {...}:

    Despues de init o de stop: por ejemplo si vamos a otra pagina y despues volvemos. Ocurre 1 o mas veces por tanto
    • Public void Stop() {...}:
      Contrapartida de start(). Cuando el usuario deja una pagina, los threads lanzados se siguen ejecutando(¡!??)
      • Destroy() {...}
      No es destruccion como en C++. Sirve para dejar bien atadas los cosas, p.ej. matar threads.
      Similar a finalize(), que es para objetos individuales. Destroy() solo en applets!
         
      • Public void paint(Graphics g)
      • Applet crea una ventana y pinta en ella: texto, lineas, imagenes
      • Paint puede ocurrir cientos de veces: cada vez que se mueve el navegador
      • Toma argumento g pasado por N automaticamente
      • Incluir import java.awt.Graphics

      Ejemplo1:

      // CicloVidaApplet.java

      import java.awt.Graphics;
      import java.applet.Applet;
       
      public class CicloVidaApplet extends Applet
      {
      int contadorInit = 0;
      int contadorStart = 0;
      int contadorPaint = 0;
      int contadorStop = 0;
      int contadorDestroy = 0;
       
      public void init() {contadorInit++;}
      public void start() {contadorStart++;}
      public void paint(Graphics g)
      {
      contadorPaint++;
      g.drawString("Contador Init: " + contadorInit, 25,25);
      g.drawString("Contador Start: " + contadorStart, 25,50);
      g.drawString("Contador Paint: " + contadorPaint, 25,75);
      g.drawString("Contador Stop: " + contadorStop, 25,100);
      g.drawString("Contador Destroy: " + contadorDestroy, 25,125);
      }
      public void stop() {contadorStop++;}
      public void destroy() {contadorDestroy++;}
      }

      Ejemplo2:

      // HolaMundoCruelApplet.java

      import java.awt.Graphics;
      import java.awt.Font;
      import java.awt.Color;
       
      public class HolaMundoCruelApplet extends java.applet.Applet
      {
      Font f = new Font("Arial", Font.BOLD, 36);
       
      public void paint(Graphics g)
      {
      g.setFont(f);
      g.setColor(Color.red);
      g.drawString("Hola mundo cruel",5,50);
      }
      }
      Crear HolaMundoCruelApplet.HTML:
      <HTML>
      <BODY>
      <applet code="HolaMundoCruelApplet.class" width=400 height=400>
      </applet>
      </BODY>
      </HTML>
       
      En el applet Java:
      • No hay init(), start(), destroy() sobreescritos. Demasiado simple!
      • 36 es el tamaño
      • posicion (x=5, y=50). El origen (0,0) es la esquina superior izquierda.
        • Probar a cortar el texto
        • No funciona!!! Hay que salir de N y volver a entrar
        • Desactivando caché ¿? Tampoco...

      En el HTML:
      • Ejemplo anterior es el mas sencillo posible.
      • El tag <APPLET>: extension del lenguaje HTML para applets
      • CODE es un atributo, el nombre del fichero class.
      • El class debe estar en el mismo directorio. Para directorio especifico, CODEBASE (mas tarde)
      • WIDTH, HEIGTH son obligatorios. Dimensiones de la caja de applet. Si pequña, se recorta.
      • Cerrar con </APPLET>
      • Opcionalmente linea siguiente a </APPLET> para N no Java ("Deberia aparecer aqui un applet si tu navegador es compatble con Java")
       
      • Mas sobre el tag <APPLET>. Otros atributos;

      <APPLET
      CODEBASE=url raiz
      CODE=fichero con la clase principal
      WIDTH=anchura
      HEIGTH=altura

      ALT=texto alternativo (para navegadores sin soporte Java pero que saben interpretar el tag APPLET
      NAME=nombre del applet. Para hacer referencia al applet desde otro o desde JavaScript
      ALIGN=alineacion (hasta 9 valores: LEFT, RIGHT, TOP, MIDDLE, etc...)
      VSPACE=espacio en pixeles dejado en blanco como margen por el N (ver p.141 21days)
      HSPACE=idem izqda-dcha

      >

      [* Parametros: explicado mas adelante]


      <PARAM NAME=unPArametro VALUE=valorDelParametro>
      <PARAM NAME=otroParametro VALUE=valor>
      <idem etc>
      Texto alternativo
      </APPLET>
      • * Parametros: en aplicaciones, linea de comandos iba a args[] en main(). Applets no tiene linea de comandos! Para pasarlos en applets se necesitan dos cosas;
        • un tag especial en el HTML
        • codigo en el applet .java para recoger los parametros

      Ej:

      <PARAM NAME=fuente VALUE="TimesRoman">
      y
      String nombreDeLaFuente = getParameter("fuente");
      Proteccion: se añade a continuacion;
      If(nombreDelaFuente == null)
      nombreDeLaFuente == "Courier";
        • Los parametros son siempre Strings. Si necesario valor numerico, tendremos que convertir

      Ej:

      <PARAM NAME=tamañoLetras VALUE="36">
      y
      int tamañoDeLetra;
      String tam = getParameter("tamaño");
      If (tam == null)
      tamañoDeLetra = 20;
      }
      else tamañoDeLetra = Integer.parseInt(tam);
      // OtroHolaMundoCruelApplet.java
      import java.awt.Graphics;
      import java.awt.Font;
      import java.awt.Color;
       
      public class OtroHolaMundoCruelApplet extends java.applet.Applet
      {
      Font f = new Font("Arial", Font.BOLD, 36);
      String nombre; // nuevo
       
      // nuevo
      public void init()
      {
      nombre = getParameter("Nombre");
      if (nombre == null) nombre = "Fulanito";
      nombre = "Hola " + nombre + "!!!";

      //
       
      public void paint(Graphics g)
      {
      g.setFont(f);
      g.setColor(Color.red);
      g.drawString("Hola mundo cruel",5,50);
      }
      }
       

      Si se sumara "Hola " + etc... en paint, seria menos eficiente. En init(), solo se ejecuta 1 vez!

       
      • Usar applets publicos:
        • O los cargamos localmente (dificultad: hay que bajar todas las clases, imagenes, sonidos, en misma jerarquia de directorios)
        • O llamamos a la clase principal con su URL en CODE
        • Las restricciones de seguridad:
          Son tan severas que los applets no pueden hacer nada demsiado serio sin autorizacion expresa (escribir, leer de disco). Base de datos?!?! Procesador de textos?!?! Imposible!!! Al menos manteniendo la seguridad al 100%.

          Graficos, texto y sonido

          • Graficos: coordenadas, lineas, puntos, circulos, ovalos, poligonos o imagenes GIF
          • Texto: fuentes, tamaños
          • Color: de fondo, de dibujo

          • Graficos
          • Lineas: g.drawline(10,10,50,50)
          • Rectangulos:
            • Cuadrados
            • Esquinas redondeadas
            • Con efecto 3D: borde en relieve

            Ej:
            g.drawRect(x,y,anchura,altura)
            g.fillRect(20,20,80,80)
            g.drawRoundRect(a,b,c,d,E,F) (ver p151 21days)
            g.fillRoundRect(...)
            g.draw3Drect(20,20,60,60,true);

             

            • Poligonos:

            Ej:
            int listaCoordX[] = {0,10,20,10,50,0};
            int listaCoordY[] = {0,20,30,60,40,0};
            int numeroPuntosPoligono = listaCoordX.length;
            g.drawPolygon(listaCoordX,listaCoordY,numeroPuntosPoligono);
             
            Con objetos;
             
            int listaCoordX[] = {0,10,20,10,50,0};
            int listaCoordY[] = {0,20,30,60,40,0};
            int numeroPuntosPoligono = listaCoordX.length;
            Polygon poligono = new Polygon(listaCoordX, listaCoordY,numeroPuntosPoligono);
            g.drawPolygon(poligono);
            // poligono.addPoint(20,30);
            // boolean estaDentro = poligono.contains(x,y);
            • Ovalos: g.drawOval(a,b,c,d)
            • Arcos: g.drawArc(a,b,c,d,e,f,g)
            • Copiando areas de la pantalla

            g.copyAerea(origenX,origenY,anchura,altura,destinoX,destinoY)
             
            // Borrar un area. Se rellena con el color de fondo
            // Para borrar todo el applet;
             
            g.clearRect(0,0,size().width,size().heigth)
            // size() devuelve un objeto Dimension

            • Texto y fuentes
            • Clases Font y FontMetrics
              • public Font(String nombre, int estilo, int tamaño)
                Estilos; PLAIN, BOLD(negrita), ITALIC, BOLD+ITALIC
                Ej:

              Font f = new Font("Helvetica", Font.BOLD, 14);
              // Font f = new Font("Helvetica", Font.BOLD + Font.ITALIC, 14);
              g.setFont(f);
              g.drawString("Texto en Helvetica y negrita", 10, 10);

              • public FontMetrics(Font fuente)
                Permite centrar un texto. Da medidas de las letras, anchura, distancia a la base, etc...

              • Color
              • De 24 bits. 3 componentes, espacio RGB
              • 0,0,0 es negro
              • 255,0,0 es rojo
              • 255,255,255 es blanco
              • etc...
              • colores predefinidos como constantes:

              Color.white, Color.yellow, Color.lightGray,etc..


              Ej:
              Color miColor = new Color(130,124,31);
              g.setColor(miColor); // empieza a dibujar con el nuevo color
              setBackground(Color.blue); // cambia el color de fondo del applet
              setForegrounf(Color.black(; // cambia de golpe el color de todo lo dibujado
               
              // CajasDeColores.java
               
              import java.awt.Graphics;
              import java.awt.Color;
               
              public class CajasDeColores extends java.applet.Applet
              {
              public void paint(Graphics g)
              {
              int rojo,verde,azul;
              for (int j = 30; j < (size().height - 25); j += 30)
              {
              for (int i = 5; i < (size().width - 25); i += 30)
{
rojo = (int) Math.floor(Math.random() * 256);
verde = (int) Math.floor(Math.random() * 256);
azul = (int) Math.floor(Math.random() * 256);
 
g.setColor(new Color(rojo,verde,azul));
g.fillRect(i,j,25,25);
g.setColor(Color.black);
g.drawRect(i-1, j-1, 25, 25);
}
}
}
}
  • Imagenes: clase Image, metodo drawImage()

// PintaFoto.java
 
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
 
public class PintaFoto extends Applet
{
Image imagen;
 
public void init()
{
imagen = getImage(getCodeBase(), "orb.gif"); //poner orb.gif en el directorio java ¡!!
}
 
public void paint(Graphics g)
{
int alturaImagen = imagen.getHeight(this);
int anchuraImagen = imagen.getWidth(this);

g.drawImage(imagen, 0, 0, this);
g.drawImage(imagen, anchuraImagen,0,anchuraImagen/2, alturaImagen*2, this); // dibuja la imagen deformada
}
}
 
  • Sonido (p209 21days)
  • Java tiene soporte para reproducir el formato .AU de Sun.
  • Solo en applets
  • En aplicaciones, se puede recurrir a una clase no documentada, sun.audio
  • Las clases que comienzan por sun.XXX incluyen funciones que aun no se han estandarizado, pero que se prevé lo hagan en un futuro próximo. Pasará de sun.audio a java.audio. De cualquier forma, no es recomendable utilizarla, cuestion de asegurar compatibilidad.
  • AU esta comprimido, pero calidad mediocre
  • metodo play(URL)
  • Ej:

play(getCodeBase(), "audio/violin.au");
 
// SonidoApplet.java
 
public class SonidoApplet extends java.applet.Applet
{
public void init()
{
play(getCodeBase(), "yahoo1.au"); // poner yahoo1.au en dir java!
}
}
  • Comienza en cuanto carga el sonido
  • Si no lo encuentra, no da error. No hará nada.
  • Para lanzar sonidos que se repitan constantemente; AudioClip

Ej:


import java.applet.AudioClip;
 
AudioClip clip = getAudioClip(getCodeBase(), "audio/ruidoDeFondo.au");
clip.play(); // suena solo una vez
clip.loop(); // suena indefinidamente
clip.stop(); // obliga a que se pare
  • AudioClip no para de sonar aunque cambiemos de pagina. Por tanto, se suele implementar clip.stop() en el metodo stop() del applet.

Ej:


// SonidoApplet.java
 
import java.applet.AudioClip;
 
public class SonidoApplet extends java.applet.Applet
{
AudioClip sonido;
 
public void init()
{
sonido = getAudioClip(getCodeBase(), "yahoo1.au");
}

 
public void start()
{
sonido.loop();
}


public void stop()
{
sonido.stop();
}

}

No se cuenta exhaustivamente todo lo que se puede hacer con las clases de Java. VER DOCUMENTACION!!!!

[editar]

14 opiniones

defaced By LatinHackTeam
OwNz yOur bOx syst3m...
We Are : d4n1ux eCORE x_Jeshua J3H3S chip d3 b10s RayoK3nt


defaced By LatinHackTeam
OwNz yOur bOx syst3m...
We Are : d4n1ux eCORE x_Jeshua J3H3S chip d3 b10s RayoK3nt

admin

defaced By LatinHackTeam
OwNz yOur bOx syst3m...
We Are : d4n1ux eCORE x_Jeshua J3H3S chip d3 b10s RayoK3nt

lala


lala

Ejemplos.

Desearia que por favor pusieran ejemplos para poder observarlos y darnos idea de lo que hace algun evento.
Muy bueno.

Me parece muy interesante el curso de java, continuen con esa labor gracioas.
1 2 3 | siguiente >

Cursos gratis relacionados con 'Introducción al lenguaje JAVA'

El lenguaje JavaScript es el complemento ideal del HTML, al permitir a la página realizar... Más »
El objetivo de este curso es aprender a programar en el lenguaje Ada, desde sus... Más »
Python es un lenguaje de programación de alto nivel, interpretado, interactivo y de propósito general. Más »
Cuando hablamos de un sitio web nos estamos refiriendo en realidad a un conjunto de... Más »
Linux es una gran herramienta, la uso desde hace años y se ha convertido en... Más »

Autor y licencia de 'Introducción al lenguaje JAVA'


Curso gratis de Unav. Extraido de: http://www.unav.es/cti CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.