Práctica 12: JMF
El profesor nos dijo que antes de comenzar con la práctica volviéramos a mirar el ejemplo hecho en clase (la clase Mi_Reproductor) e intentáramos comprenderlo bien.
El Ejercicio 1 se puede completar con este ejemplo, ya que el funcionamiento es el mismo que el de la clase Mi_Reproductor sólo que utilizamos el archivo : video.mpeg.
Ésta clase (ahora llamada Ejercicio1) hereda de JFrame e implementa de ControllerListener , suponemos entonces que va a utilizar elementos de control.
- Atributos:
- Player player = null; //Reproductor, como su propio nombre dice lo que hace es reproducir, no tiene una imagen, es un objeto.
- Component visualComponent = null; // Componente de reproducción del vídeo, éste si que tiene representación real, una parte de la ventana será destinada para esto (similar a un Jpanel).
- Component controlComponent = null; // Controles, también tiene representación visual. (play/pause/stop…).
- Component progressBar = null; // Barra de progreso.
- String MEDIAFILE = “file:video.mpeg”; // Localiza el archivo
Cuestión: ¿ cómo sabemos que el Player está preparado?
El Player avisa lanzando cierta información, tiene varios estados.
- Constructor:
-
Sobre el panel principal establezco un “Layout”.
-
Para crear el Player utilizo: a) url b) manager
3. Tenemos que identificar nuestro fichero mediante un objeto de la clase URL (Uniform Resource Location)
4. Debemos especificar en qué lugar está nuestro fichero
URL url = null;
url = new URL(MEDIAFILE);
Trabajar con URL requiere conocer qué tipo de excepción puede generar:
- MalformedURLException e : URL no valida
Para activar el Player:
Player crea una entidad que denomina Manager :
player=Manager.createPlayer(url);
Para saber en qué estado está el Player, una opción es añadir un ControllerListener: controla los estados por los que va pasando el Player, ahora el control del Player pasa directamente al método ControllerUpdate().
player.addControllerListener(this);
Manager también tiene sus excepciones:
- Lectura/Escritura
- NoPlayerException : o existe el reproductor
Importante: éstas excepciones las requiere Java
Una vez que ya hemos controlado los errores podemos activarlo:
player.start(); // Comienza la reproducción.
- Método controllerUpdate (…):
public synchronized void controllerUpdate(ControllerEvent event){
}
- Comprobamos que el reproductor está “vivo”
- ¿Qué evento se ha producido?
- Comprobamos si el evento es una instancia de (instanceof) RealizeCompleteEvent: hereda de ControllerEvent. Sólo cuando el Player esté realizado, cuando tenga un objeto de ésta clase como evento podré hacer:
getContentPane().add(“Center”,visualComponent);
contenedor.add(“Center”,controlComponent);
Hasta que no éste realizado no los puedo visualizar.
-Comprobamos si el evento es una instancia de EndOfMediaEvent: también hereda de ControllerEvent. Si ha terminado de reproducir el archivo ponemos de nuevo el tiempo a cero y volvemos a activar el Player :
player.setMediaTime(new Time(0));
player.start();
-Comprobamos si el evento es una instancia de ControllerErrorEvent: t ambién hereda de ControllerEvent. Si se produce un error de control se lanza un mensaje.
- Y ya por último, el Método “main”:
public static void main (String[] args) {
Ejercicio1 reproductor = new Ejercicio1();
reproductor.setSize(100, 100);
reproductor.setVisible(true);
}
Ejercicio 2 : “Crea ahora a partir de este reproductor uno que permita que el usuario decida qué ha de suceder cuando el vídeo llega a su fin (volver a reproducir o no)”
Para ello, utilizando la clase anterior, tenemos que modificar el método controllerUpdate(…) , y concretamente cuando el evento es una instancia de EndOfMediaEvent.
Para crear un diálogo simple y estándar utilizamos un JOptionPane del tipo “question” con las opciones “si” o “no”.
Una página muy útil donde vienen todos los tipos de JOptionPane explicados, con ejemplos y en castellano es:
http://ji.ehu.es/lmalonso/sw/java/bib/tutorjava/html/ui/swingcomponents/dialog.html
Cuando finalice el video primero se mostrará el mensaje , si la opción elegida es “si” volvemos a reproducir (como estaba antes), si la opción es “no” : paramos el Player, liberamos los recursos y cerramos la ventana (acabando la aplicación).
Código:
else if (event instanceof EndOfMediaEvent){
int n = JOptionPane.showConfirmDialog(this, “¿Quiere volver a reproducir?”,”Reproducir”,JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION) {
player.setMediaTime(new Time(0));
player.start();
}
else if (n == JOptionPane.NO_OPTION) {
player.stop();
player.deallocate();
System.exit(0);
}
}
Ejercicio 3: “añade dos botones que permitan acceder directamente a dos escenas”
Una escena comienza a los 6 segundos y otra a las 12 segundos. Para controlar esto tendremos que utilizar el método:
setMediaTime(new Time(double seconds));
Éste método tiene como parámetro un objeto de la clase Time que a su vez tiene como parámetro en su constructor un double (que serán los segundos).
Para éste ejercicio creamos dos botones “escena 1” y “escena 2” que los inicializamos y los añadimos al panel principal en el constructor. También les asignamos el escuchador.
Utilizamos la clase de los anteriores ejercicios y añadimos, como clase anidada , la clase:
class Manejador implements ActionListener
En ella, si el evento producido corresponde con el botón “escena 1” pondremos el tiempo a 6 segundos y reproducimos.
Si el evento corresponde con el botón “escena 2” el tiempo será de 12 segundos.
Obviamente estos dos botones se podrán utilizar en todo momento de la reproducción.
Código del método actionPerformed(…) :
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == escena1){
player.setMediaTime(new Time(6.0)); //El tiempo debe ser de tipo double
player.start();
}
else if (e.getSource() == escena2) {
player.setMediaTime(new Time(12.0));
player.start();
}
}



Comentarios recientes