Selestoca’s Weblog











{Mayo 26, 2008}   PRACTICA 12

Buena ya que da menos que antes, ánimos …. Esperamos que este último post os ayude a entender mejor sobre jmf(que por sí sóla parece un mundo…jeje), nos a costado un poco entenderlo; pero viendo apuntes y y recordando las prácticas de servidores(para quienes la tengan ), ayuda  entenderlo mejor.

JMF(Java Media Framework)

Introducción:

Los paquetes principales que debemos tener presente en JMF son aquellos de los que haremos uso de sus clases principales , por ejemplo para data source que es una clase del paquete de javax.media.protocol, clases Player y Processor que son interfaces de javax.media, clase Data Sink que es una clase del paqiuete  javax.media.

Las clases principales del JMF son la adquisición de datos (captura desde un dispositivo físico, lectura de un fichero o recepción desde la red), procesado (aplicación de efectos como filtrado o realces, compresión y/o descompresión, conversión entre formatos) y la salida de datos (presentación, almacenamiento en fichero o transmisión a través de la red). :

Clase DataSource.- Esta clase se encarga de encapsular la localización, el protocolo de transferencia y el software necesarios para la adquisición. Por lo tanto una vez obtenido un DataSource no se puede asociar a otra fuente de datos.

Player.- Un Player es un objeto encargado de procesar cierto flujo de datos multimedia y presentarlo en su preciso momento.

DataSink.- La función de este objeto es obtener el media stream y almacenarlo en un fichero local, a través de la red o transmitirlo mediante RTP. 

EJERCICIO 1 Y 2

Ponemos los 2 ejercicios juntos ya que lo único que había que poner en el ejercicio 2 era un botón que hace que si se pulsa una vez, cuando finaliza el video se para la reproducción y al pulsarle de nuevo, cuando finaliza el video se repite una y otra vez.

Hemos creado una clase que implemente ControllerListener para poder crear el reproductor y el ActionListener para los eventos del JButton. Lo que hemos necesitado para crearlo a sido un Player, JButton y un Componente.

Para crear el player lo hemos hecho a través de una URL que carga el archivo pasándole el nombre del fichero como un String. El player se crea a través del Manager.createPlayer(URL url) y luego le añadimos su escuchador: addControllerListener(this) (this porque lo creamos en la misma clase).

Implementamos el método ActionPerformed, que simplemente nos cambiará un boolean para que se repita o no la reproducción cuando se detecte un evento de ratón sobre el botón.
También implementamos el método controllerUpdate y utilizamos los eventos RealizeCompleteEvent para poder añadir los componentes, ya que solo se pueden añadir cuando el player esta realizado; y el evento de EndOfMediaEvent para que se repita o no cuando finaliza la reproducción.

 Os añadimos nuestro código para aquellos que os interese:



{Mayo 21, 2008}   Práctica 11

Bueno, bueno… ya queda menos y por fin terminamos con esto!!!

SWING Y EVENTOS…

En esta práctica solo hicimos en clase hasta el apartado 3..

APARTADO 1

Más o menos nos defendimos bien y ya con el juego teniamos idea de como hacerlo.
Nosotras implementamos el ActionListener ya que solo tiene un método y nos parecía la forma más fácil de hacerlo. Tambien se podía hacer heredando de MouseAdapter, porque si se implementa, tiene muchos métodos que no se van a utilizar.
Este es nuestro código:

 
 
import javax.swing.*;
import java.awt.event.*;
import
java.awt.*;
 
 
public class Simple00GUI implements ActionListener 

 

JButton boton;
publicSimple00GUI(){
JFrame f = new JFrame(“Boton”);
boton =
new JButton(“Pulsa”);
f.add(boton);
f.pack();
f.setVisible(
true);
boton.addActionListener(
this
);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 
public void actionPerformed(ActionEvent ae){
 

 

 if(ae.getSource() == boton){
 System.out.println(boton.getText());}
}
 public static void main(String[]args){
Simple00GUI simple = new Simple00GUI();

}
}

Si no lo entendeis o algo nos lo preguntais…

APARTADO 2

Este apartado se parece mucho a un ejercicio que hicimos otro día con etiquetas. El código lo hemos puesto igual que el Simple00GUI añadiendo una etiqueta.

En el ActionPerformed añadimos la opción para cambiar el fondo con
if(getBackground() == Color.BLUE)
etiqueta.setBackfground(Color.YELLOW);
else

Además añadimos un System.out.println(…) con el nombre del hilo que se esta ejecutando en ese momento que nos sirve un poco de repaso.

APARTADO 3

En este apartado nos liamos bastante… nos pidio el profesor que el hilo que cambiase el color de fondo lo hiciese otro hilo y no el main. El programa no nos compilaba bien…

Creamos una clase Hilo que implementaba Runnable con su método run() que se encargaba de cambiar el color de fondo. En el main creamos un Thread con el hilo y un BufferedReader para que leyese el ENTER del teclado… pero aún asi, entre la falta de tiempo y el lio que nos hicimos no pudimos terminarlo.

 



{Mayo 16, 2008}   PRACTICA 10

Swing y Eventos

EJERCICIO1

Qué es un proceso y un programa, qué diferencias existe entre ambas?

Si vamos a una descripción teórica un PROCESO es dinámico, su estado cambia con el tiempo, según la CPU va ejeucutando las diversas opoeracines que se enumeran en un programa. Un PROGRAMA es algo dinámico, es el conjunto de instrucciones máquina que ha generado el compilador a partir del código fuente.

En clase se dijo que es complicado dar una diferencia entre un proceso y un programa, lo que se  explicó es que solo se puede ejecutar una tarea por proceso, repartiendo el tiempo en instanates pequeños para cada proceso, el cpu los trata por vez. Utilizando una cola para asignar prioridades.

Los primeros apartados nos dicen que compilemos los programas que nos dan Ding, Dong, DingDongPoor

Ding -> al dar un enter se lanaza por cmd mensajes de DING!. Al revisar el código no encontramos nada fuera de lo común un try para tratar las excepciones que que se pueden dar con Sistem.in.read

Dong -> cada cierto tiempo se imprime por pantalla DONG!. Al ver el código, la sentencia que no s llamó la atención fué “Thread.sleep(1000)” y la explicación que se dio es que sirve para asignar un tiempo de espera para qeu se realize luego algo.

DingDongPoor-> el código es la unión de los dos programas anteriores, funciona mal ya que hay un ‘cruce’ en el tiempo de ejecución del mismo, no sabe cuando esperar por el enter o cuando estar en estado de dormir para cada Dong!.

Al lanzar simultaneaente Ding y Dong comprobamos que es compòrtamiento es como el de DingDongPoor, En linux pueden ejecutarse los dos programas a la vez y realizando llo que el ususario realmente espera, que a cada enter aparez el DING! y cda cierto tiempoel DONG!.

 

EJERCICIO 2

En esta parte hablamos sobre los hilos de ejecución conocido s como THREADS, son hilos asociados a un mismo proceso, de esta manera podremos hacer que en el sistema operativo  realice varias tareas a la vez. Para lanzar nuevos hilos necesitamos de: Thread->start() y Runnable->run(), que es cada cosa?

Runnable.- Es un interfaz, por tanto no podemos crear un objeto de tal tipo. Contiene un método llamado run(), que es lo que se hará en el programa.

Thread.- Hilo,  de tal forma que  mediante Thread t  = new Threads (r)  obtengo un hilo que está relacinado con Runnable.

start()-> crea un thread y luego llama a run para hacer lo que dice run.

Existen dos formas de conseguir threads en java, Una es implementando la interface Runnable, la otra es extender la clase Thread.

Algo a tener en cuenta muy importante es que no puedo invocar a run directamente, ya que no está lanzada la bifurcación(instrucción que crea una copia de un proceso en sistemas operativos) y eso lo hace start().

EJERCICIO 3

Vimos tambien las condiciones de carrera, RaceCondition. Las condiciones de carrera se producen cuando 2 hilos intentan acceder al mismo recurso al mismo tiempo. El código que tuvimos que ejecutar lanzaba 2 hilos y lo primero que te esperas es que salgan 10.000 ceros y luego 10.000 unos y no es así. Lo que obsevamos es que salen los ceros y los unos aleatoriamente, es decir, sale por pantalla el primero que llega al recurso.

Una de las formas que pensamos para evitar las condiciones de carrera de este código es añadir un Thread.sleep(1000); por ejemplo, entre la llamada al start() de los 2 hilos para que el 2º hilo espere el tiempo necesario para que se impriman antes los ceros.

El siguiente código que vimos, RaceConditionSolved,  nos soluciona las condiciones de carrera utilizando un Vector. Viendo el código vimos que añaden una ‘z’ que realmente, si la quitamos, el programa se ejecuta de igual manera.
Le preguntamos al profesor el porqué de esa ‘z’ que se añade y nos dijo que es un valor por defecto que se suele añadir a la hora de programar y se utiliza como “control” y, efectivamente, no influía en nada.

 



{Mayo 7, 2008}   PRACTICA 9

SWING

Estamos en la parte más interesante de la asignatura, la parte donde podemos ver más real nuestros programas…. Para los que asistíamos con Alberto tenemos nuevo profesor.

Empezamos con un concepto básico: Qué es una GUIs(interfaz gráfica)? Podríamos pensar que es representar gráficamente un programa; pero es un concepto no del todo acertado ya que es la manera en la que el programa se comunica con el usuario, en busca de respuestas que el usuario puede introducirlas por medio del ratón o del teclado. En la parte teórica viene conceptos básicos sobre las interfaces que valen la pena revisar y entenderlas.

Ejercicio 1:

Tenemos que importar nuevas clases, adaptadas cada una según para lo que el usuario necesite.

JFrame-> Usada para ventanas       JPanel-> Usada para contenedores        JLabel->Usada para etiquetas

Resolviendo cada guión del ejercio 1, lo hicimos en conjunto, deteniéndonos para analizar el comportamiento de cada método.

En el guión 5 para modificar el tamaño  tenemos que hacer uso de frame.setSize(400,200);Para cambiar el color de fondo(guión 6) usamos label.setBackground(Color.BLUE) y label.setOpaque(true), ya que el Api de Java nos dice que si la etiqueta no es opaca, el color no se visualiza.

 Ejercicio 2

Manejadores de ventana:
1. Esta parte es más teórica
2. Si se anula el manejador de ventana, lo que ocurre es que en el momento de cerrarla, el programa se mantiene en ejecución y para dejar de ejecutarse deberíamos cerrarlo a lo bestia (Ctrl+Alt+Supr) y si se ejecuta desde MS-DOS con Ctrl+C vale.
3. se utilizaria f.setUndecorated(true), entonces nos quitaría el “decorado” de la ventana y no nos pondría los botones de cerrar, minimizar y maximizar. Por lo tanto, para cerrar la ventana tendríamos que hacerlo como el apartado 2.
4. Se utilizaría el método JFrame.setDefaultLookAndFeelDecorated(true); que se pondría al principio de todo justo despues de la linea del main porque sino no se visualizaria.

Ejercicio 3

Layouts, se consideran “plantillas”, que al ponerlas establece un esquema de como se van a colocar los elementos dentro del panel.
En este ejercicio hemos llegado hasta el apartado 5. Para poner el color a las etiquetas hemos tenido que hacerlo como en el apartado 6 del ejercicio 1. Para colocar las etiquetas como nos piden, debemos poner como plantilla un BorderLayout:
f.setLayout(new BorderLayout());
Aunque para este caso no haria falta, puesto que se pueden colocar las etiquetas añadiendolas al contenedor principal y poniendo su posición:  f.add(j1, BorderLayout.NORTH);
 

 

 Para colocar una imagen desde un archivo hemos utilizado la clase ImageIcon:
 ImageIcon imagen =  new ImageIcon(“arrow.jpg”);
 Y luego la añadimos a una etiqueta: 
 JLabel j5 =  new JLabel(imagen);
y se añadiría al panel igual que las demás etiquetas.
Os ponemos nuestro código aquí:
 

 

  
 
 

 

 

 

 



etcétera