[java] Problem z KeyListener

0

Mam problem z prawidłowym zaimplementowaniem funkcji do obsługi klawisza. Chcę aby po wciśnięciu jakiegokolwiek klawisza jego znak pojawił się w Label dane. Męczę się już jakiś czas i nie mogę tego pojąć. Oto częściowy kod:

 class MyFrame extends Frame implements KeyListener{
    CalcBinaryTest p;

    public void keyPressed(KeyEvent e) 
    {
            System.out.println("dsdada");
    }
    public void keyTyped(KeyEvent e)
    {
            System.out.println("dsdaddsaa");
    }
    public void keyReleased(KeyEvent e)
    {

    }
    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() {
        String prevtext = dane.getText();
        dane.setText(prevtext+" / ");
    }

    public void PutResult() {

    public void ShowInfo() {

    }

    public static void main(String args[]) {
        CalcBinaryTest p = new CalcBinaryTest();
        p.frame = new MyFrame(p);

        p.frame.setVisible(true);
    }
}

Na początku sprawdzam System.out.println czy to w ogóle reaguje ale niestety nic nie działa.

0

A do czego tego KeyListenera dodajesz? Swoją drogą, właściwie po co? Istnieją przecież inne kontrolki oprócz Label, np. TextField.

0
iooi napisał(a)

A do czego tego KeyListenera dodajesz? Swoją drogą, właściwie po co? Istnieją przecież inne kontrolki oprócz Label, np. TextField.

Wiem wiem, ale akurat w zadaniu jest napisane, że nie mogę używać textfield, ani textarea.

0

A co z KeyListenerem? Coś musi wysyłać do niego odebrane zdarzenia. Dodaj np. do konstruktora MyFrame linijkę:

addKeyListener(this);
0

Niestety nie pomaga, próbowałem jeszcze coś takiego:


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() {
              public void keyPressed(KeyEvent keyEvent) {
                System.out.println("dsadada");
              }

              public void keyReleased(KeyEvent keyEvent) {

              }

              public void keyTyped(KeyEvent keyEvent) {
                  System.out.println("dsadsadaczxcxz");
              }
        };

        p.frame.addKeyListener(keyListener);
        p.frame.setVisible(true);
    }
}

Znalazłem przykład na internecie, ale również nie ma żadnej reakcji.

0
p.dane.setFocusable(true);

KeyListener musi być dodany do każdego komponentu, który ma odbierać zdarzenia. To znaczy, że nie wystarczy dodać go tylko do rodzica - dodaj albo do Labela, albo do obydwu, albo usuń tą linijkę. Nie wiem, czy jest coś takiego w AWT/Swingu, ale w SWT listenera można dodać do samego Displaya, który odbiera wszystkie eventy.

0

Dodałem i już reaguje na przyciski niestety jak chcę aby konkretnie do label wstawiło mi znak to w konsoli wyrzuca błąd.
Kod:

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) {
                 //System.out.println("realase");
              }

              public void keyTyped(KeyEvent keyEvent) {
                  if(keyEvent.getKeyChar() == 'a')
                  {
                      p.dane.setText("blabla");
                      System.out.println("dsdsadsaadada");
                  }
              }
        };

        p.frame.addKeyListener(keyListener);
        //p.dane.setFocusable(true);
        p.frame.setFocusable(true); 
        p.frame.setVisible(true);
    } 

W MyFrame dodałem
p.dane = new Label();
p.dane.setBounds(10, 30, 250, 20);
p.dane.setFocusable(true);

niestety ciągle wyskakuje błąd jak naciskam 'a', ale w konsoli System.out.println z keyPressed wybija.

Problem ciągle aktualny.

0

Jaki to błąd?

0

Już sobie poradziłem jakoś. Musiałem stworzyć w klasie CalcBinaryTest konstruktor w której są zaimplementowane te KeyListenery i Pole w klasie public static KeyListener keyListener. Ogólnie już działa. Wybija mi to co chcę w Label lecz niestety do czasu póki nie nacisnę jakiegoś button'a. Po tym już nie reaguje znowu.

Już nie ważne. Wystarczyło w MyFrame zrobić do każdego przycisku addKeyListener();

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