Тема: Як позбутися глюку КeyListener-а?

Добрий день, виникла така проблема:
клас відповідає за створення каталогу, в який далі будуть розміщуватися відповідні файли проекту. При введені імені проекту, перевіряється наявність відповідного. якщо такий проект вже існує виводиться відповідне повідомлення, а при подальшому введені, або зміні назви, повідомлення повине зникати

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package g.dialogWindows;

import g.gui.GuiComp;
import g.gui.RGB;
import g.gui.Windows;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import vs.VS;

/**
 *
 * @author andry
 */
public class NewProect extends VS{
    private static JFrame wnp;
    public static Color c = RGB.getColor("D0F1CC");//rфоновий колір
    private static Box x;
    private static boolean finale = false;
    private static boolean isDir = false;//чи істує каталог
    private static JTextField tf;//каталог
    public static String newDir = startDir;//шлях до катлогу
    private static String sn = "";
    private static JTextField tfn;//проект назва

    public static void is() {
        wnp = Windows.winUndecoration(new Dimension(550, 400), c);
            wnp.addKeyListener(new DirKeyListener());//слухач клави
            x = Box.createVerticalBox();
                JPanel p2 = proectDir();//блок вибору каталогу
            x.add(p2);
                JPanel p3 = newProectNamePanel();//блок введеня імені проекту (каталог проекту отримає це ім'я)
            x.add(p3);
                //далі мае бути ще ненаписаний блок вибору налаштувань проекту
                JPanel p1 = GuiComp.panel(c);//створення або відміна
                    JButton b = GuiComp.textButton(RGB.getColor("D38561"), Color.BLACK, "Відмінити", 16);
                        b.addActionListener(new ActionListener() {
                            @Override
                            public void actionPerformed(ActionEvent ae) {
                                wnp.setVisible(false);
                            }
                        });
                    JButton b1 = GuiComp.textButton(RGB.getColor("A9A9A9"), Color.BLACK, "Створити", 16);
                p1.add(b);
                p1.add(b1);
            x.add(p1, BorderLayout.SOUTH);
        wnp.getContentPane().add(x, BorderLayout.WEST);
    }

    public static void revalidate() {
        if(x != null){
            wnp.getContentPane().removeAll();
        }
            wnp.addKeyListener(new DirKeyListener());//слухач клави
            x = Box.createVerticalBox();
                JPanel p2 = proectDir();//блок вибору каталогу
            x.add(p2);
                JPanel p3 = newProectNamePanel();//блок введеня імені проекту (каталог проекту отримає це ім'я)
            x.add(p3);
                JPanel p1 = GuiComp.panel(c);
                    JButton b = GuiComp.textButton(RGB.getColor("D38561"), Color.BLACK, "Відмінити", 16);
                        b.addActionListener(new ActionListener() {
                            @Override
                            public void actionPerformed(ActionEvent ae) {
                                wnp.setVisible(false);
                            }
                        });
                    JButton b1 = GuiComp.textButton(RGB.getColor("D38561"), Color.BLACK, "Створити", 16);
                    //
                    JLabel l = GuiComp.RGBPlain(Color.red, 14, "Такий проект вже існує!!!");//власне повідомлення про те, шо такий проект існує
                p1.add(b);
                p1.add(b1);
                if(isDir){
                    p1.add(l);
                }
            x.add(p1, BorderLayout.SOUTH);
        wnp.getContentPane().add(x, BorderLayout.WEST);
        wnp.validate();
    }

    private static JPanel proectDir() {
        JPanel p = GuiComp.panel(c);
            tf = new JTextField(newDir, 25);//шлях до створюваного каталога
            JButton b = GuiComp.textButton(RGB.getColor("A9A9A9"), Color.BLACK, "Обрати...(Сtrl + D)", 16);
                b.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        sys.Load.dir();//вибір нової теки
                    }
                });
        p.add(tf);
        p.add(b);
        return p;
    }

    private static JPanel newProectNamePanel() {
        JPanel p = GuiComp.panel(c);
            tfn = new JTextField(sn, 25);//поле для введення назви проекту
            tfn.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent ke) {
                sn = tfn.getText();//записуємо назву в зміну
                File f = new File(newDir);
                if(isDir){
                    isDir = false;//Якщо в нас вже було введене ім'я існуючого каталогу змінюємо isDir на фалс ы обновляємо вікно
                    revalidate();
                }
                //перевіряємо, чи введене ім'я відповідає вже існуючим іменам
                for(File item1 : f.listFiles()){
                    if(sn.equals(item1.getName())){
                        isDir = true;
                        revalidate();
                        break;
                    }
                }
            }
        });
            JLabel l = GuiComp.RGBPlain(Color.BLACK, 14, "Назва проекту");
        p.add(tfn);
        p.add(l);
        return p;
    }

    private static class DirKeyListener implements KeyListener {

        @Override
        public void keyTyped(KeyEvent ke) {}

        @Override
        public void keyPressed(KeyEvent ke) {
            if(ke.isControlDown() && ke.getKeyCode() == KeyEvent.VK_D){
                sys.Load.dir();
            }
        }

        @Override
        public void keyReleased(KeyEvent ke) {}
    }
    
}

Для перевірки створив каталог red, і спробував ввести таке саме ім'я. виникли такі баги:
- повідомлення про наявність такого каталогу вивело не після введення red, а після натискання будь якої іншої кнопки з клавфіатури (наприклад 1)
- Після цього в полі вводу залишилося лише red, а не red1, як мало б бути по логіці.
- Подальше введення та редагування поля вводу стало неможливим.

Якщо хтось може допомогти, дякую...