Cómo crear programas Java con GUI utilizando GCJ, GLADE y GTK

En este artículo se explicará cómo crear programas Java con interfaz gráfica (GUI) utilizando solamente software libre. Se utilizará GCJ, CLASSPATH, GLADE y GTK.

Conceptos básicos

  • Java: Lenguaje de programación
  • Compilador java: Compila el código fuente java y genera un bytecode
  • Bytecode: código intermedio que puede ser interpretado (casi) en cualquier máquina virtual Java
  • Máquina virtual Java: Interpreta el bytecode Java

Existen varias máquinas virtuales de Java: Sun, IBM, GNU. GNU Compiler for Java, o GCJ, es una implementación libre de la máquina virtual Java. No están implementas todas las funciones que soporta la máquina virual de Sun. Sun liberó su máquina virtual de Java como software libre, pero aún no ha salido una versión estable.

GNU CLASSPATH es una biblioteca de clases esenciales para máquinas virtuales de Java. Es una alternativa libre a las clases de Sun.

El estándar de Java establece dos bibliotecas de interfaces gráficas: AWT y SWING. AWT utiliza widgets del sistema operativo y por lo tanto su apariencia depende del sistema operativo. SWING utiliza widgets propios, asi que se ve igual en todos los sistemas operativos sobre los que se ejecuta. Otra alternativa es utilizar la biblioteca GTK, en la cual está basado GNOME. GTK es multiplataforma y funciona en GNU/Linux, Windows, Mac OS, entre otros.

GLADE es un programa que permite diseñar interfaces gráficas y las almacena como archivos XML. Luego, los programas Java pueden leer estos archivos XML. Al separar la interfaz gráfica del código, éste se simplifica.

En resumen, podemos utilizar las siguientes herramientas libres para crear programas Java con interfaz gráfica:

  • Glade para diseñar la interfaz gráfica de la aplicación
  • GCJ como máquina virtual de Java
  • Biblioteca GTK para dibujar los widgets

Instalación

Aquí solo cubriré la instalación de estas herramientas en gNewSense, pero debería lo mismo para Ubuntu 6.06 (Dapper) y quizás para Debian y otros derivados de Debian. Debemos instalar los siguientes paquetes:

  • gcj
  • classpath
  • classpath-doc
  • glade-2
  • libgnome-java
  • libglade-java
  • libgconf-java
  • libgtk-java

Luego agregamos las bibliotecas que utilizaremos a la variable de entorno CLASSPATH

export CLASSPATH=/usr/share/java/glade2.12.jar:\
/usr/share/java/gtk2.8.jar:/usr/share/java/glib0.2.jar:.

Podemos ver los ejemplos que vienen con el paquete libglade-java. Los copiaremos para poder jugar con ellos:

cd
cp -r /usr/share/doc/libglade-java/examples/glade .
cd glade
gunzip *.gz

Y luego los compilamos con GCJ:

javac *.java

Ejecución

Para ejecutar los ejemplos hay que hacer lo siguiente:

cd ..
java glade.Test
java glade.Example1
java glade.LibGladeTest glade/gtk.glade

Documentación

La documentación sobre la API y los ejemplos de cada paquete están disponibles en:

  • libglade-java
    • /usr/share/doc/libglade-java/api/index.html
    • /usr/share/doc/libglade-java/examples
  • Classpath
    • /usr/share/doc/classpath-doc/api/index.html
    • /usr/share/doc/classpath-doc/api/examples
  • libgtk
    • /usr/share/doc/libgtk-java/api/index.html
    • /usr/share/doc/libgtk-java/examples

Enlaces

Hasta aquí llega mi artículo. Con los ejemplos, la documentación y los enlaces es suficiente para continuar. Happy Hacking ;)

9 comentarios

  1. Miguel
    Publicado el Julio 15, 2007 a las 12:31 pm | Permalink

    buena explicacion, me funciona bakan

    gracias por la explicacion

    saludos

  2. Publicado el Septiembre 14, 2007 a las 4:01 pm | Permalink

    Gracias por el artículo, en los requerimientos a instalar te falta colocar el paquete “libglade-java-doc” (uso Kubuntu).
    Otra cosa, ¿cuando compilás haciendo “javac *.java” no estás usando el compilador de SUN? ¿no tendrías que hacer “gcj *.java”?

    Saludos!

  3. Publicado el Septiembre 14, 2007 a las 4:11 pm | Permalink

    Gracias por indicarme ese paquete faltante, aunque no es un requerimiento para ejecutar GJC o Glade.
    No tengo instalada la máquina virtual de Sun, así que en mi caso estoy ejecutando el compilador libre GCJ. javac es una especie de alias de gcj.

  4. Publicado el Septiembre 14, 2007 a las 4:39 pm | Permalink

    Ups! Igualmente veo que ahora no me funciona: me da este error.
    [manuel] [~/proyectos/jcalculation]$ java glade.Test
    Exception in thread “main” java.lang.UnsatisfiedLinkError: libgtkjni-2.10: libglibjni-0.4.so: no se puede abrír el archivo de objeto compartido: No existe el fichero ó directorio
    at java.lang.Runtime._load(libgcj.so.81)
    at java.lang.Runtime.loadLibrary(libgcj.so.81)
    at java.lang.System.loadLibrary(libgcj.so.81)
    at org.gnu.gtk.Gtk.(gtk2.10-2.10.2.jar.so)
    at java.lang.Class.initializeClass(libgcj.so.81)
    at glade.Test.main(Test.java:38)
    [manuel] [~/proyectos/jcalculation]$

    Si sabés alguna solución te lo agradecería…

  5. nercof
    Publicado el Septiembre 15, 2007 a las 1:51 pm | Permalink

    No logré hacerlo funcionar :( te paso el error por ahí sabes que esta pasando.
    guille@leinad-desktop:~/Programacion/Java/glade$ javac -classpath /usr/share/java/glade2.12.jar:/usr/share/java/gtk2.10.jar:/usr/share/java/glib0.4.jar:. Test.java
    guille@leinad-desktop:~/Programacion/Java/glade$ java Test
    Exception in thread “main” java.lang.NoClassDefFoundError: Test (wrong name: glade/Test)
    at java.lang.ClassLoader.defineClass0(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
    guille@leinad-desktop:~/Programacion/Java/glade$

    Uso Ubuntu 7.04

  6. Gustavo Rosero
    Publicado el Febrero 22, 2008 a las 10:13 pm | Permalink

    cuando hago una regresion de estimacion curvilinea con spps12 me sale un mensaje de java.lang.nullpointerexception null y no se grafica… que debo hacer

  7. Dania
    Publicado el Marzo 28, 2008 a las 3:46 pm | Permalink

    No me gusto nada de esto adios locos

  8. AXL
    Publicado el Agosto 29, 2008 a las 2:36 am | Permalink

    pues la explicacion va muy bien pero aun luego de haber hecho esto el compilador me bota errores aun con programas basicos como presentar por pantalla la frase “hola mundo” los programas estan bien es decir no tienen errores los he corrido el mandriva 2008 sin ningun problema el problema esta en hacerlos correr el ubuntu 8.04 que es el sistema operativo que uso… con el ubuntu 7.10 no tuve ningun problema el problema me surgio el en 8.04… hasta ahora he tenido qaue trabajar en mandriva para realizar mis trabajos en java… el problema es solo con java pues los codigos en c python c++ y otros me los compila de maravilla… he probado con el gcj como lo hacia con anterioridad incluso me he instalado el eclipse como ultimo recurso pues con el geany ya habia probado y con algunos otros si me pudieran hechar una mano seria de mucha ayuda… AGRADECIDO DE ANTEMANO QUIEN EL REMITENTE

  9. AXL
    Publicado el Agosto 29, 2008 a las 2:38 am | Permalink

    pues la explicacion va muy bien pero aun luego de haber hecho esto el compilador me bota errores aun con programas basicos como presentar por pantalla la frase “hola mundo” los programas estan bien es decir no tienen errores los he corrido el mandriva 2008 sin ningun problema el problema esta en hacerlos correr el ubuntu 8.04 que es el sistema operativo que uso… con el ubuntu 7.10 no tuve ningun problema el problema me surgio el en 8.04… hasta ahora he tenido qaue trabajar en mandriva para realizar mis trabajos en java… el problema es solo con java pues los codigos en c python c++ y otros me los compila de maravilla… he probado con el gcj como lo hacia con anterioridad incluso me he instalado el eclipse como ultimo recurso pues con el geany ya habia probado y con algunos otros si me pudieran hechar una mano seria de mucha ayuda… AGRADECIDO DE ANTEMANO QUIEN OS ESCRIBE

Escribe un comentario

Tu email nunca será publicado o compartido.