[java] problem z KeyListener

madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

[java] problem z KeyListener

Post autor: madaf007 »

Witam, no już próbowałem na wszystkie sposoby i nie mam bladego pojęcia czego mi to nie chce działać. W kalkulatorze muszę po prostu zrobić KeyListener aby po wciśnieciu przyciska, daną literę wstawiło w Label. Niby reaguje coś tam po naciśnieciu (bo w consoli wybija to co jest w System.out.println()) ale nie chce wstawić w Label liczbę i w konsoli wybija błąd. Tak jakby do tego label nie mogło się dostać. PIERWSZA POLOWA KODU TO SAMA RAMKA, także proszę się nie bać, że dałem za długi kod do analizy.

Kod: Zaznacz cały

 
class MyFrame extends Frame
{
CalcBinaryTest p;
MyFrame(CalcBinaryTest p) {
                super("Kalkulator Binarny");
                setBounds(100, 100, 300, 300);
                setBackground(Color.BLUE);
                setLayout(null);
                addWindowListener(new MyWindowAdapter());
                setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 15));

                KoncowyPrzycisk koniec = new KoncowyPrzycisk();
                ButtonSUM suma = new ButtonSUM(p);
                ButtonSUBS substraction = new ButtonSUBS(p);

                ButtonZERO zero = new ButtonZERO(p);
                ButtonONE one = new ButtonONE(p);
                ButtonMULTI multi = new ButtonMULTI(p);
                ButtonDIV division = new ButtonDIV(p);
                ButtonRESULT res = new ButtonRESULT(p);
                ButtonINFO BInf = new ButtonINFO(p);

                suma.setBounds(160, 60, 60, 60);
                substraction.setBounds(230, 60, 60, 60);
                zero.setBounds(10, 60, 60, 60);
                one.setBounds(80, 60, 60, 60);
                multi.setBounds(160, 130, 60, 60);
                division.setBounds(230, 130, 60, 60);
                res.setBounds(160, 200, 60, 60);
                BInf.setBounds(10, 200, 60, 60);

                p.dane = new Label();
                p.dane.setFocusable(true);
                p.dane.setBounds(10, 30, 250, 20);

                add(p.dane);
                add(suma);
                add(substraction);
                add(multi);
                add(zero);
                add(one);
                add(res);
                add(division);
                add(koniec);
                add(BInf);
                setResizable(true);
        }
}
public class CalcBinaryTest{
        Label dane;
        MyFrame frame;
        MyInfo information;

        public static String aa, bb;
        public static int a, b;
        
        
        public void PutSum() {

        }

        public void PutSubs() {

        }

        public void PutZero(){

        }

        public void PutOne() {

        }

        public void PutMulti() {

        }

        public void PutDiv() {
        }

        public void PutResult() {
                

        public void ShowInfo() {

        }
}
public static void main(String args[]) {
                CalcBinaryTest p = new CalcBinaryTest();
                p.frame = new MyFrame(p);
                KeyListener keyListener = new KeyListener() {
                CalcBinaryTest p;
                      public void keyPressed(KeyEvent keyEvent) {
                        System.out.println("dsadada");
                      }

                      public void keyReleased(KeyEvent keyEvent) {
                              
                      }

                      public void keyTyped(KeyEvent keyEvent) {
                             p.dane.setText("blablabla");
                              System.out.println("dsadsadaczxcxz");
                      }
                };
               
                p.frame.addKeyListener(keyListener);
                p.frame.setFocusable(true); 
                p.frame.setVisible(true);
        }
}
Proszę o pomoc. No taka błaha sprawa, a nie mogę sobie z tym poradzić:(
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[java] problem z KeyListener

Post autor: Afish »

Kod: Zaznacz cały

CalcBinaryTest p = new CalcBinaryTest();
                p.frame = new MyFrame(p);
                KeyListener keyListener = new KeyListener() {
                CalcBinaryTest p;
W KeyListener tworzysz sobie nowy obiekt typu CalcBinaryTest, który przesłania Ci ten, do którego chcesz się dostać. Pomijam już fakt, że po zakończeniu funkcji main tracisz dostęp do niego, bo zmienna jest lokalna. Zatem nie dziwi błąd, bo w listenerze odwołujesz się do zmiennej, która jest niezainicjalizowana.
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

[java] problem z KeyListener

Post autor: madaf007 »

Aha rozumiem. Właśnie nie wiem jak teraz dostać się do tej zmiennej 'dane', bez tworzenia tego obiektu w keylistenerze. Jeśli nie mam tam stworzonego obiektu to eclipse powiadamia, że tej zmiennej nie widzi. Jak sobie z tym poradzić?
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[java] problem z KeyListener

Post autor: Afish »

Zrobić ten obiekt polem klasy. Wtedy będziesz prawdopodobnie musiał zmienić sposób implementacji interfejsu KeyListener, bo pewnie kompilator zacznie krzyczeć, że zmienna nie jest oznaczona jako final. Najlepiej przerobić to w ten sposób, aby to klasa CalcBinaryTest implementowała ten interfejs. No i zamiast inicjalizować obiekty w funkcji main, zrób to w konstruktorze klasy.
madaf007
Użytkownik
Użytkownik
Posty: 131
Rejestracja: 4 wrz 2008, o 17:01
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 33 razy

[java] problem z KeyListener

Post autor: madaf007 »

Dzięki wielkie. Teraz działa. Zrobiłem Konstruktor, gdzie wsadziłem tą implementacje, dodałem pola CalcBinaryTest c oraz public static KeyListener keyListener. A te wywołania zostawiłem w mainie. Bo jak je przeniosłem wyżej do klasy to eclipse nie chciał skompilować pokazując właśnie na te linijki.

Jest jeszcze jeden problem. Działa to do czasu jak nie nacisnę jakiegoś button'a, potem już nie reaguje.

Już reaguje. Wystarczyło do każdego przycisku dodać addKeyListener();
ODPOWIEDZ