23 febrero 2006

updateUI

Creía tener controlado el tema de repintados en java. Cuando hacía algo con una ventana (modificar los datos, pintar gráficos, etc, etc) simplemente había que llamar al método repaint(). Este método nofifica a la máquina virtual que el componente necesita repintado. Más adelante, cuando la máquina virtual lo dispone y en un hilo separado, se llama al método paint(Graphics) del componente para que este se pinte.

Sin embargo, encontré un pequeño problema que me ha traido loco durante un buen rato. Resulta que si al hacer una ventana hago esto

ventana = new Ventana();
ventana.add (los botones);
ventana.setVisible(true);

todo va estupendo. Pero si altero el orden

ventana = new Ventana();
ventana.setVisible(true);
ventana.add (los botones);

no hay manera de que se pinten los botones. Por más cosas que he intentado (añadir repaint() al final), no hay manera de que pinten nuevos componentes sobre una ventana ya visible. Al redimensionar la ventana con el ratón, los componentes aparecen de golpe.

Finalmente, gracias a un compañero de trabajo, descubrí el método updateUI(). Este método sí dibuja realmente todos los componentes.

ventana = new Ventana();
ventana.setVisible(true);
ventana.add (los botones);
ventana.updateUI();

No hay comentarios: