Mostrando entradas con la etiqueta Java FX. Mostrar todas las entradas
Mostrando entradas con la etiqueta Java FX. Mostrar todas las entradas

martes, 21 de junio de 2011

Componente para reproducir vídeos en JavaFX 2

Continuando con el nuevo JavaFX, he empezado a trabajar con la reproducción de contenido multimedia.

Lo primero que hay que resaltar, es que esta nueva versión de JavaFX, al menos por el momento, viene muy limitada al permitir sólo la reproducción de vídeo en formato FLV (que contenga vídeo en formato VP6 y audio en formato MP3).

Tal como se describe en la página de JavaFX, las clases implicadas en la reproducción de vídeos son:

Media - contiene información sobre el recurso, como su fuente, resolución y metadatos.
MediaPlayer - proporciona los controles para la reproducción (arranque, pausa, volumen...)
MediaView - extiende de nodo, y aporta la posibilidad de añadir animaciones, efectos...

Así que podemos reproducir un vídeo FLV con el siguiente código.

media = new Media(mediaPath);
   player = new MediaPlayer(media);
   view = new MediaView(player);
  getChildren().add(vbox);
   player.play();
Partiendo de esta base, he creado un pequeño componente que implementa un reproductor de vídeo sencillo, con posibilidad de pausar, avanzar, retroceder, ir a una posición concreta, y de cambiar el volumen. La clase extiende de javafx.scene.layout.Region, de forma que puede añadirse directamente al layout de una aplicación. Por ejemplo:

public void start(Stage primaryStage) {
     Group root = new Group();
        
     border = new BorderPane();
     border.setCenter(new VideoPlayer(videoPath);
        
     root.getChildren().add(border);
     Scene scene = new Scene(root, 800, 600);
           
     primaryStage.setScene(scene);
     primaryStage.setVisible(true);
  }
A la hora de indicar la ruta del vídeo que se quiere reproducir es importante tener en cuenta que no se admiten espacios; en su lugar tenemos que poner %20. Por ejemplo: 

C:/Documents%20and%20Settings/user/Mis%20documentos/1.flv

Aquí se puede descargar el VideoPlayer.

domingo, 5 de junio de 2011

Uso de CellFactory en Java FX 2

Tras las primeras horas bicheando JavaFX 2, aquí un post en el que explico cómo definir la forma en que se presentan los elementos de un lista.

Lo que tenemos es un objeto de tipo ListView, que se muestra por pantalla como una lista de elementos. Lo primero que debemos tener en cuenta, es que la forma más correcta de manejar su contenido es tener una ObservableList, que será sobre la que hagamos los cambios (adición, eliminación y actualización de elementos). Si fijamos esta lista observable como contenido de la ListView, ésta será notificada cada vez que se produzca un cambio en la colección, y tendremos la vista de nuestra aplicación siempre actualizada.



Pero lo que necesitamos en este caso es manejar una lista de elementos más complejos. Por ejemplo, supongamos que tenemos la clase Persona:


Sin problema podríamos crear una lista para presentar una serie de personas con el siguiente código.


Pero al ejecutar este código, lo que veríamos en la lista sería el valor obtenido al llamar al método toString de la clase Persona. Si no lo hemos sobrescrito, se mostraría la referencia al objeto. Un primer paso para refinar este comportamiento se reduciría a crear un método toString que devolviese el nombre y apellidos de la persona, y así podríamos ver esos valores en la lista.

Pero supongamos que queremos ir más allá, y no sólo presentar el nombre completo de la persona, sino también utilizar un color distinto en función de su edad, mostrando en rojo a los adultos, y en azul a los que todavía no lo son. Pues para eso podemos utilizar el método setCellFactory de la clase ListView.


Como podemos ver, la entrada al método es un objeto que implemente la interfaz Callback, con el que básicamente le decimos a la lista cómo debe crear sus celdas. La interfaz define un único método, call, que devolverá, en nuestro caso, una celda que contiene una persona (ListCell). 



Como podemos ver en el código anterior, el método call define en primer lugar un elemento Text, y después una ListCell, que es la celda que vamos a devolver. En este caso creamos una celda de Persona, y construimos el objeto sobrescribiendo el método updateItem, en el que configuramos el elemento Text como queremos, y lo asignamos como nodo de la celda. De esta forma, cuando veamos la lista por pantalla, lo que se presentará para cada elemento será el Text, con la configuración dada en función de los datos del objeto Persona correspondiente.

No sé si la explicación ha quedado clara, pero al ejecutarlo se verá que la idea es muy sencilla. Además, a partir de aquí surgen muchas posibilidades, ya que podemos representar elementos complejos dentro de una lista contando con todas las posibilidades de JavaFX.

martes, 31 de mayo de 2011

Java FX 2 - Error de instalación del plugin para Net Beans 7.0

El pasado 24 de mayo salió la versión beta del nuevo Java FX 2. Tras mucho tiempo esperando este último intento de convertir Java FX en una tecnología con repercusión, andaba ansioso por empezar a cacharrear, y plantearme algún proyectito para ver qué nos podía ofrecer.

Pero nada más empezar, ya me estaba dando cabezazos. Resulta que tenemos disponible un plugin para la versión 7.0 de Net Beans. Me lo descargo, lo instalo, reinicio el IDE como me piden, y... casquiporre.

Warning - could not install some modules

Y una larga retahíla de librerías o similares.

Como en las instrucciones de instalación no se especifica nada sobre errores, y en principio las había seeguido tal cuál, incluyendo la instalación previa del runtime, empecé a probar siguiendo mi instinto. Reinstalación de Net Beans, rebajada del plugin, reinicio del pc, tonterías varias... nada de nada.

Hasta que en el foro de Oracle encontré la solución gracias a la ayuda de 862201. La historia es que antes de instalar el plugin en sí, hay que instalar todas las actualizaciones disponibles. Esto lo hacemos accediendo a Tools - Plugins, y seleccionando todos los elementos de la pestaña Updates.

Ahora sí, ¡a juguetear!