Algunos consejos para hacer ventanas en java

Casi todos, y yo el primero, solemos ponernos a programar sabiendo lo mínimo para empezar y vamos aprendiendo sobre la marcha. Prácticamente nadie se coge los miles de manuales que hay disponibles en java y se los lee antes de empezar a hacer el programa que quiere hacer.

Un caso concreto es el paquete SWING de java. Casi todos, y yo el primero, aprendo lo mínimo de cómo hacer la ventana y me pongo a hacerla. Luego aprendo sobre la marcha.

Después de varios años programando ventanas SWING, vas aprendiendo de mala manera todo eso que no has leido a priori. Tus primeras ventanas son desastrosas. Las ventanas secundarias se van detrás de la principal y no se ven, la interface de usuario se te queda bloqueada mientras se ejecuta un algoritmo más o menos complejo, a veces las cosas se quedan bloqueadas sin motivo aparente….

Bueno, pues aquí van algunas de las cosas básicas que se deben tener en cuenta al hacer ventanas y con las que se suele meter la pata al principio por desconocimiento.

  • En la aplicación sólo debe haber un único JFrame, correspondiente a la aplicación principal. Todas las ventanas secundarias deben ser JDialog. Todas las ventanas secundarias deben tener una ventana padre, que es a partir de la cual se despliega. Es decir, todos los JDialog secundarios deben tener como padre al JFrame principal. Si desde un JDialog se va a visualizar otro, este segundo debe tener como padre al primero, y así sucesivamente.
  • Evita en lo posible los JDialog modales, o ten muy en cuenta su jerarquía de padres. El primer JDialog modal no tiene problemas si le pones su padre adecuadamente. Si tienes un JDialog modal visible, no muestres otro JDialog secundario, salvo que también sea modal y sea hijo del anterior. Si pones visibles a la vez dos JDialog modales y no son el uno hijo del otro, tendrás problemas al intentar escribir en ellos o cerrarlos.
  • Nunca heredes de JFrame o JDialog o JApplet para hacer tus ventanas. Hazlo siempre de un componente que no sea ventana y que no te limite. Si tus ventanas heredan de JPanel, podrás ponerlas siempre que quieras dentro de un JFrame, un JDialog, un JInternalFrame, un JApplet o incluso incrustarlas en otro JPanel. Si tu ventana hereda de JFrame, está condenada a ser un JFrame toda su vida.
  • Reaprovecha las ventanas, no se las dejes al recolector de basura. Si un botón, al apretarlo, visualiza un JDialog, no hagas un new de JDialog cada vez que pulsas el botón. Es mejor hacer sólo un new la primera vez y guardarselo. En las siguientes veces bastará con hacer setVisible(true) y setVisible(false). Para que el recolector de basura libere una ventana, además de lo habitual, hay como minimo que llamar al método dispose() de dicha ventana  -cosa que mucha gente no sabe- , para que el sistema de eventos de teclado y ratón eliminen todas las referencias que tienen a ella. De todas formas, incluso así no tengo muy claro que los JDialog se liberen siempre y, desde luego, en versiones anteriores de java, los JFrame NUNCA se liberaban. La excusa de SUN es que como sólo debía haber un JFrame principal, no tenía sentido liberarlo.
  • Los layouts para situar componentes no son tan complicados, sólo hay que ponerse a ello. No uses el layout null, ya que tu ventana no será redimensionable y puedes tener problemas si cambia la fuente de letra, si tu programa se ejecuta en otro sistema operativo, se cambia el look & feel, etc.
  • Una vez que sepas los layouts simples, tenderás a hacer ventanas grandes a base de anidar muchos JPanel que a su vez tienen dentro JPanel que su vez tienen dentro JPanel, todos ellos con un layout simple. Eso hace ventanas muy pesadas y que consumen mucho. Aprende a usar el GridBagLayout para hacer un solo panel con todo. La excepción a esto es que tengas pequeños JPanel reutilizables, como un editor de coordenadas geográficas que pida latitud, norte/sur, longitud, este/oeste, un panel que pida usuario y password, etc.
  • Todos los eventos de ratón y teclado se ejecutan en el mismo hilo que repinta las ventanas. Si en un actionPerformed(), keyPressed(), … tu código tarda mucho o pretendes que se pinte algo en una ventana, simplemente no lo hará hasta que tu código termine. Si tu código en un actionPerformed() va a tardar mucho o tiene que pintar cosas en la ventana, lanza un hilo aparte para hacer esa tarea y termina el actionPerformed() lo antes posible.

Y como esto hay muchísimas más cosas, pero estas son las que si no se hacen bien desde el principio, luego cuesta muchísimo arreglar el programa.

Esta entrada fue publicada en java. Guarda el enlace permanente.

7 respuestas a Algunos consejos para hacer ventanas en java

  1. Sundance dijo:

    Muy bueno. Como siempre.

  2. Pingback: Consejos para programar en SWING

  3. Pingback: Yo, programador » Blog Archive » Consejos para programar con Swing

  4. Kabish dijo:

    Yo uso los JForms de JGoodies que, además de ser fáciles de aprender y utilizar, permiten usar el editor JFormDesigner para hacer pantallas a la velocidad de la luz.

    Muy buenos los consejos sobre JDialog e hilos. Me cuesta usarlos, tengo que ponerme manos a la obra con ellos sobre todo en el caso de los threads.

    Saludos.

  5. Novata programando dijo:

    Excelentes consejos para los que estamos aprendiendo. Mil gracias!!!

  6. hTs.afTA | kal_el dijo:

    exelente el cometario compadre se agradece, mira yo trabajo con un solo jframe y de ahi me voy con puros jinternalframe el cual cuando cada vez que creo una ventana extra a la principal es un jpanel el cual retorno y ese lo pego al jinternalframe, lo que es jdialog, solo los uso para mensajes, eso del layout me dejo medio preocupado, ya que siempre le coloco null layout pork me da rabia hacer ventanas y que moleste el layout, pero para mas adelante lo tendre en consideracion, ya que uso look and feel tal como escribiste
    chaus saludos

  7. xchande dijo:

    muy buen aporte brother, tambien estoy dandole a java, y bueno, aun ando medio novato pero lo que planteas me esta pasando… jajaj, saludos, y bueno a programar se ha dicho

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.