2008/03/20 |
Mis amigos Héctor, Polesino y yo hemos estado haciendo un proyecto para la materia de Interacción del Ser Humano y la Computadora. Bueno, la Universidad se encuentra en huelga y no tenemos clases, pero seguimos avanzando el proyecto con la esperanza de que nos ahorre trabajo cuando regresemos a clases.
El proyecto es relativamente sencillo: El usuario debe de escoger un pixel en específico de una imagen en particular, y el programa deberá encontrar todos los pixeles en dicha imagen cuyo color corresponda con el del pixel escogido. Obviamente debemos de poner atención especial en cómo mostramos los resultados al usuario, y hasta ahora tenemos buenas ideas.
Estamos realizando el proyecto en Java, utilizando NetBeans. El problema es que Swing no contiene un componente similar al PictureBox
de .NET: un componente que permita cargar una imagen y mostrarla a una escala determinada (Tip para la gente de Sun: programen algo así y harán felices a miles de desarrolladores en todo el mundo).
Y eso es lo que nosotros necesitamos para este proyecto: un componente dentro de un JScrollPane
que pueda ser escalado dinámicamente. ¿Qué opciones nos quedan? La primera es la más obvia, pero también la menos elegante: utilizar un JLabel
y poner la imagen de fondo utilizando setIcon()
. Yo me incliné más por crear una clase que heredara de JPanel
y utilizara g.drawImage()
para nuestro propósito. Y así lo hicimos.
Lo malo es que mi implementación disparaba una excepción muy extraña, y causaba que la GUI no se pintara correctamente en la pantalla (de hecho, teníamos que minimizar/restaurar la ventana para que la aplicación se mostrara correctamente). Sin tomar en cuenta ese bug continuamos desarrollando la aplicación hasta casi terminarla.
Ayer fui con Héctor y decidimos tratar de resolver el problema. Me inspiré en el código que viene en el tutorial de Swing, pero no logré que el programa redimensionara el JLabel
para que se mostrara la imagen completa. Más tarde llegó Yorch y nos fuimos al cine, así que hasta ahí se quedó.
Hoy en la mañana desperté con esa sensación que todos los desarrolladores hemos sentido: debo de resolver el problema. Y lo hice. Empecé un pequeño proyecto desde cero para implementar el PictureBox
que necesitamos. Con la mente limpia todo salió bien. Irónicamente, el código final se parece demasiado al que había implementado, con la diferencia que heredé de JLabel
en vez de JPanel
. Afortunadamente, la excepción ya no aparece. El programa es un poco lento, espero arreglar eso pronto.
Si a alguien le interesa, puedo publicar el código.
Nota: Bueno, más bien, un consejo: Por lo que más quieran en esta vida, no traten de programar el layout de su aplicación a mano. Utilicen las herramientas drag & drop que vienen con NetBeans. Eso lo aprendimos a la mala. 🙂