sábado, 27 de agosto de 2011

Android - Error en R.java - Syntax Error on Tokens

De vuelta tras vacaciones y líos varios, y justo un mes después de la última entrada, retomo las publicaciones contando un pequeño problema que me he encontrado jugueteando un poco más con Android.

Resulta que estaba haciendo ligeras modificaciones en el main.xml para añadir un simple TextView a la pantalla, y cuando he terminado y me disponía a probar los cambios en el móvil, me he encontrado con que la clase R.java tenía un error.

Lo primero que hay que decir es que esta clase es generada de forma automática, y Eclipse se cuida mucho de que no la toquemos. Si lo intentamos nos avisará de que no debemos, pero no queda ahí la cosa. Si somos temerarios y le decimos que nos dan igual sus advertencias, nos encontraremos con que tras guardar los cambios el entorno volverá a generar la clase perdiendo lo que hemos hecho. Vamos, que el tratar de corregir la clase por nuestra cuenta es una batalla perdida.

Así que para hacer las cosas bien, lo que necesitamos es saber por qué se está generando la clase con un error. En este caso el que se me presentaba era:


La clase R.java, explicado sucintamente, es un índice con todos los recursos del proyecto Android. Luego si hay un error de sintaxis en ella por un token no reconocido, seguramente se deba a que hemos utilizado un carácter extraño en algún sitio.

En mi caso, por ejemplo, tras rebuscar un poco, conseguí darme cuenta de que había declarado el nuevo texto de la siguiente manera:


Lo que a simple vista parece correcto. Pero si nos fijamos otra vez, podemos observar que en el identificador pone @+ìd/enemyLifeText. Esa tilde sobre la primera i es la que está causando el problema. Si la eliminamos, la clase R.java se regenera y los problemas desaparecen.

miércoles, 27 de julio de 2011

Trabajar con varrays en Oracle

Aunque a nivel personal no los he utilizado nunca, en algunas ocasiones me he encontrado en proyectos de mantenimiento con modelos de datos que definían sus propios tipos en Oracle. Lo más habitual es la definición de una colección de elementos utilizando VARRAY.

Cada vez que uno de estos casos se presenta ante mí, me asalta la misma duda. ¿Cómo actualizo o inserto datos en una columna de un tipo definido sobre un VARRAY? La realidad es que no tiene complejidad ninguna. En este caso el valor se crea de forma similar a como se haría con un objeto, poniendo el nombre del tipo y, entre paréntesis, el contenido del array, con los valores separados por comas.

Por ejemplo, si hemos definido este tipo:

CREATE OR REPLACE TYPE MY_TYPE AS VARRAY(100)  OF VARCHAR2(32);

Insertaríamos en esa columna así:

INSERT INTO NOMBRE_TABLE (CAMPO_ARRAY) VALUES (MY_TYPE('1', '2', '3'));

La forma de actualizar sería análoga.

miércoles, 20 de julio de 2011

Tablas en JavaFX 2

En el nuevo JavaFX, existe un componente "oculto" muy interesante. Y digo oculto porque no se menciona su existencia en los tutoriales de la página principal del proyecto, aunque lógicamente sí que podemos encontrar toda la información necesaria en el api. Se trata del TableView.

Como era de esperar, lo que podemos hacer con este componente es mostrar tablas en nuestra aplicación. Su funcionamiento es muy similar al de ListView, pero tiene la ventaja de que permite trabajar con columnas. El caso de uso típico será aquél en que queramos mostrar una tabla donde cada fila contenga, separados en columnas, los atributos de un objeto. 

Si partimos del ejemplo que ya vimos en uso de CellFactory en JavaFX 2, en ese caso definimos un CellFactory para mostrar en cada fila del ListView el nombre y apellidos de una Persona. Como alternativa, con TableView podríamos mostrar cada campo en una columna distinta.


Al igual que ya hicimos trabajando con ListView, podemos definir un CellFactory, en este caso a nivel de columna, en el que indiquemos cómo deben ser presentadas. Por ejemplo, podemos definir la columna para el nombre como una columna de Persona, en lugar de como una de String.


Y ahora, podemos definir el CellFactory para mostrar en la columna el nombre de la persona, con un color dependiente de su edad.


He aquí el resultado.





lunes, 27 de junio de 2011

Excluir librerías del jar con NetBeans

Este post sirve de continuación al que escribí hace casi un año, explicando cómo incluir las librerías de nuestro proyecto en el jar generado por NetBeans. En este caso, y por petición del amigo Anómino a través de los comentarios, vamos a ver cómo excluir librerías.

La clave para hacer lo que queremos está en la etiqueta zipgroupfileset del build.xml. Con este elemento le indicamos al entorno qué queremos añadir al jar que generamos. En aquél caso indicábamos que queríamos meter todos los jar de la carpeta dist/lib.


Ahora se nos presentan dos opciones para quitar elementos. El primero es indicar explícitamente qué librerías no nos interesan en el mismo zipgroupfileset utilizando su atributo excludes.


En este caso, como puede verse, le estamos indicando que no incluya la librería beansbinding.

Si necesitamos dejar fuera más de una, podemos añadirlas separándolas por un espacio.



Como segunda alternativa, en lugar de pedir que se incluyan todas, y luego añadir excepciones, podemos meter un elemento para cada una de las librerías que queramos tener en el jar de la aplicación, de la siguiente forma.


O, igual que antes, podemos tener un único elemento con todas las librerías a incluir separadas por espacios.



En conclusión, que para determinar exactamente qué librerías queremos en el jar de nuestra aplicación no tenemos más que jugar con los atributos includes y excludes, y podremos conseguir lo que nos interese.

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.