Problem z KeyListenerem

0

Zgłaszam swój problem z keyListener ponieważ te co są umieszczone na forum niestety mi nie pomogły. Mam prośbe o szybką odpowiedź co może być źle.

// obsługa listenera

private void formKeyPressed(java.awt.event.KeyEvent evt) {                                
       int kodklawisza = evt.getKeyCode();
        if (kodklawisza==KeyEvent.VK_ENTER) {
            try {
                pol(nazwa_uzytkownika.getText(), haslo_uzytkownika.getText());
                this.setVisible(false);
            } catch (SQLException ex) {
                ex.printStackTrace();
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }
        }
    }    

//a tak dodany jest do ramki

addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                formKeyPressed(evt);
            }
        });

Wszystko pod NetBeans. ale nie wiem czy akurat tutaj o środowisko chodzi.

Pozdrawiam i czekam na szybką odpowiedź.

0

Kod jest w sumie dobry (z punktu widzenia kompilatora), a jakie są objawy błędu?

Swoją drogą... kod nie jest do końca dobry (z punktu widzenia zasad programowania). Co to za zapytania SQL i łapanie SQLException w tym kodzie robią :D ? W ten sposób nie powinno się pisać. Naciśnięcie klawisza powinno wywołać metodę pol(), która powinna nie rzucać wyjątkami, ale zwrócić mapę z kluczem "errors", "bledy" itp.:

private void formKeyPressed(java.awt.event.KeyEvent evt) {                               
       int kodklawisza = evt.getKeyCode();
        if (kodklawisza==KeyEvent.VK_ENTER) {
                Map<String, Object> map = pol(nazwa_uzytkownika.getText(), haslo_uzytkownika.getText());
                if(!map.isEmpty())
                  this.setVisible(false);
                else if(map.get("error")!=null){
                   // obsługa błędu
                }
        }
    }

Jeszcze lepiej jak by, całość opierała się o jakiś interfejs, za pomocą którego obsługiwane były by kliknięcia. Metoda formKeyPressed() powinna pochodzić z napisanego przez Ciebie interfejsu, podobnie jak pol(). W ten sposób można łatwo w razie czego wymienić implementację.

0

Dzięki za zwrócenie uwagi na zasady pisania programu. :)

Pomijając w/w błędy (zajmę się tym później) Problem tkwi w tym że po wciśnieciu przycisku ENTER program w ogóle nie raguje :/ dlatego pomyślałem ze błąd tkwi gdzies w kodzie :/

Czekam na dalsze porady i dzięki za dotychczasowe :)

Pozdrawiam!

0

A czy lecą jakieś wyjątki? To raz, a dwa, spróbuj dopisać elsa po ifie sprawdzającym jaki klawisz wciśnięto i tam wstawić jakiś debug, który sprawdzi czy przez przypadek if nie jest olewany.

0

Hej. Wyjątki żadne się nie pokazują i dlatego nie moge nic na ten temat wiecej powiedzieć. Wstawiłem else i też nie reaguje na przycisk :/ Nie wiem o co chodzi. Jakiś pomysł albo sugestia??

Dzięki z góry.

Pozdrawiam!!

0

do jakiego obiektu podpięty jest KeyListener ?
co jest aktywne (ma fokus) gdy użytkownik naciska Enter ?
pozdrawiam

0

Czy nie powinieneś przeciążyć metod:

public void keyPressed(KeyEvent e) 
public void keyReleased(KeyEvent e) 
public void keyTyped(KeyEvent e) 

Gdy implementujesz interfejs KeyListener ?

class Sluchacz implements KeyListner {
	public void keyPressed(KeyEvent e)  {
	}
	public void keyReleased(KeyEvent e) {
	}
	public void keyTyped(KeyEvent e) {
	}
}
0
bogdans napisał(a)

do jakiego obiektu podpięty jest KeyListener ?
co jest aktywne (ma fokus) gdy użytkownik naciska Enter ?
pozdrawiam

Hej właśnie do końca nie wiem do czego jest podpięte wydaje mi się że do ramki bo tą cześć kodu NetBeans generuje. Podpiełem pod panel i też nic się nie dzieje tzn bez zmian. Ale gdy np. podpiełem pod pole tekstowe to zadziałało. Czyli zależy od tego gdzie jest podpięty i czy to coś ma focusa w tym przypadku pole tekstowe. A jak np. zrobić żeby było podpięte do ramki i działał??

Dzięki za podpowiedź :)

Pozdrawiam!

0

Spróbuj wywołać (w odpowiednim miejscu)

ramka.requestFocus();

,
ale to jest bardzo niepewne, użytkownik w coś sobie kliknie i przeniesie fokus.
Ewentualnie podepnij tego KeyListenera do wszystkiego co widać.
pozdrawiam

0

Nie musi do wszystkiego, jest taka opcja gdzies ze zdarzenai dzieciecych kontrolek jesli nie sa obslugiwane przez sama kontrolke to sa wysylane do rodzica, i tak dalej itd, az w koncu moze dojsc do samej formy.

0

Dzięki za pomoc, popatrze jeszcze w necie co jest z tymi keylistenerami i focusami zeby to było bardziej efektywne niż poprzypinanie tego do wszystkiego co się da :P

W każdym razie pomogliście mi i za to dziękuje

Pozdrawiam!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1