[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