Тема: Як позбутися глюку К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, як мало б бути по логіці.
- Подальше введення та редагування поля вводу стало неможливим.
Якщо хтось може допомогти, дякую...