viernes, octubre 28, 2005

Indebuggeable

Esta mañana he conseguido el bug perfecto, el bug que no se puede depurar. Ayer retomé una de las viejas preguntas de Chuchi, el enfermo de Chuchi (porque está enfermo, con gripe aviar, no porque sea un enfermo), sobre cómo cerrar un formulario Java pulsando la tecla ESC sin necesidad de controlar el evento en todos y cada uno de los controles de la ventana. Tras probar varios códigos, el que más parecía funcionar era el de este hilo del foro de Sun. Una pequeña adaptación y resulta en el siguiente código:
this.addKeyPressedRecursive (this.getComponents()) ; //Esto iría en cualquier parte

private void addKeyPressedRecursive (Component c[]) {
    Action escape = new EscapeAction () ;
    for (int i = 0 ; i < c.length ; i ++ ) {
        if (c [i] instanceof Container) {
            addKeyPressedRecursive (((Container) c [i]).getComponents ()) ;
        }
        ((JComponent) c [i]).getInputMap ().put (KeyStroke.getKeyStroke (
            KeyEvent.VK_ESCAPE, 0), escape) ;
        ((JComponent) c [i]).getActionMap ().put (escape, escape) ;

    }
}

private class EscapeAction extends AbstractAction {
    public void actionPerformed(ActionEvent e) {
        ((JDialog) this.getRootPane ().getParent ()).dispose () ;
    }
}
Esto está muy bien, te cierra el Dialog que has abierto y todo eso. Sólo que se pasa un poco. Cierra absolutamente todo lo que tengas abierto (el Eclipse no, no sé porqué). Pero si lo intentas depurar (debug), funciona bien. Es un bug indebuggeable. Ideal para bugbusters.

Por cierto, la única solución que he encontrado de momento es sustituir lo marcado en rojo por:
c[i].addKeyListener(new java.awt.event.KeyAdapter() {
    public void keyReleased(java.awt.event.KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
        ((JDialog) this.getRootPane ().getParent ()).dispose () ;
    }
});
De todas formas, Chuchi, al fin encontré una manera menos guarra de controlar la maldita tecla :)

2 Comentarios:

Blogger chuchiperriman ha dicho...

Ese chals!!!! Eres un monstruo :) Ya mañana voy a currelar que ya estoy mejor.

10:53 a. m.  
Blogger Lek ha dicho...

Si mañana piensas darme otra paliza como la de hoy, por mí vuelve a cogerte la baja... argh!, toda la tarde cargando ordenadores de aquí pá'llá

7:39 p. m.  

Publicar un comentario

<< Principal