KeyEvent no se consume en ejecución normal pero en debug sí.

Holas buenas tardes, me enfrento a la siguiente situación, a ver si a alguno de ustedes les ha pasado.

En un frame tengo un texfield, el cual tiene un key listener. Si se presiona enter realiza una sumatoria y limpia un caja de texto, si se presiona F4, abre un dialogo para capturar información la cual se pone en una caja de texto en el frame principal.

Para el dialogo sobreescribo el método createRootPane para obtener eventos con el teclado para aceptar o cancelar el proceso:

@Override protected JRootPane createRootPane() {
    JRootPane root = super.createRootPane();
   
    //agregamos default key listeners
    KeyStroke enterKey = KeyStroke.getKeyStroke("pressed ENTER");
    KeyStroke escapeKey = KeyStroke.getKeyStroke("pressed ESCAPE");
   
    root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(enterKey, "aceptarAction");
    root.getActionMap().put("aceptarAction", new AbstractAction() {
        @Override public void actionPerformed(ActionEvent e) {
            aceptarCommand();
        }
    });
   
    root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escapeKey, "cancelarAction");
    root.getActionMap().put("cancelarAction", new AbstractAction() {
        @Override public void actionPerformed(ActionEvent e) {
            cancelarCommand();
        }
    });
   
    return root;
}

Ese código funciona como se espera. En el dialogo al estar en un textfield, capturar la información y presionar enter, se llama al metodo de aceptar, realiza su chamba y cierra el dialogo.
Sin embargo, por alguna extraña, el texfield en el frame principal, donde se presiono F4, lanza un keyevent con el enter que se presionó en el dialogo, ocasionando que realize la sumatoria y limpie la caja de texto, lo cual no debe suceder así.
Ahora, lo mas raro del asunto, es que si en Eclipse (el IDE que manejo) pongo un break point en la llamada al metodo aceptar del dialogo (o en cualquier parte de la pila de llamadas), el text field del frame principal ya no lanza el keyevent con el enter.

Aqui pongo un ejemplo pequeño que hize, a ver si con ustedes se comporta igual. Dan F4 en la el text field de la izquierda y debe mostrar un dialogo, escriben algo y dan enter y veran que se asigna el texto en la caja del frame y luego se limpia, por que entra el enter. Si escriben algo en el dialogo y solo cierran, lo escrito se pondra en la caja de texto.

import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class TestFrame extends JFrame{
       
        JTextField field;
        JTextArea area;
       
        InfoDlg dlg;
       
        TestFrame(){
                setTitle("Ejemplo de acciones");
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                field = new JTextField();
                area = new JTextArea();
               
                field.setColumns(20);
                area.setColumns(20);
                area.setRows(5);
                area.setEditable(false);
               
                getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
                getContentPane().add(new JLabel("Field (F4, Enter)"));
                getContentPane().add(field);
                getContentPane().add(Box.createHorizontalStrut(50));
                getContentPane().add(new JLabel("Area (Resumen)"));
                getContentPane().add(new JScrollPane(area));
                pack();
               
                field.addKeyListener(new KeyAdapter(){
                        @Override public void keyReleased(KeyEvent ke){
                                if(KeyEvent.VK_F4 == ke.getKeyCode()){
                                        showDialog();
                                } else if(KeyEvent.VK_ENTER == ke.getKeyCode()){
                                        cleanCaja();
                                }
                        }
                });
        }
       
        private void showDialog(){
                if(dlg == null){
                        dlg = new InfoDlg(this);
                }
               
                dlg.setVisible(true);
               
                String text = dlg.getTexto();
                area.setText(text);
        }
       
        private void cleanCaja(){
                area.setText(null);
        }

        public static void main(String[] args) throws Exception{
                TestFrame frame = new TestFrame();
               
                frame.setVisible(true);
        }
       
        private class InfoDlg extends JDialog{
               
                JTextField textoField;
               
               
                InfoDlg(Window padre){
                        super(padre);
                        setTitle("Informacion Dlg");
                        setModal(true);
                        setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
                       
                        textoField = new JTextField();
                        textoField.setColumns(10);
                       
                        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
                        getContentPane().add(textoField);
                        pack();
                }
               
                @Override protected JRootPane createRootPane() {
                        JRootPane root = super.createRootPane();
                       
                        KeyStroke enterKey = KeyStroke.getKeyStroke("pressed ENTER");
                       
                        root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(enterKey, "aceptarAction");
                        root.getActionMap().put("aceptarAction", new AbstractAction() {
                                @Override public void actionPerformed(ActionEvent e) {
                                        onAceptar();
                                }
                        });
                       
                        return root;
                }
               
                public String getTexto(){
                        return textoField.getText().trim();
                }
               
                private void onAceptar(){
                        setVisible(false);
                }
        }
}