KeyListener + ActionListener

0

Witam,
Jestem początkujący i pisze pierwszą mini grę - węża.
Początkowo stworzyłem klasę Panel dziedziczącą JPanel zawierającą grę, gdzie znajdował się KeyListener i wszystko działało tak jak trzeba. Niestety po stworzeniu klasy Menu dziedziczącej JPanel, gdzie znajdowało się menu z przyciskiem, po którego naciśnięciu przechodzimy do gry wystąpił problem. Gra po naciśnięciu przycisku się uruchamia, jednak nie reaguje już na klawiaturę.
Poniżej istotne fragmenty kodów.

Ramka:

public class Gra extends JFrame{
	
	public Gra(){
		super("Gra wąż");
		Panel panel=new Panel();
		add(panel);
		panel.setVisible(true);
		pack();
		panel.setVisible(false);
		Menu menu=new Menu(panel);
		add(menu);
		menu.setVisible(true);
		menu.setFocusable(true);
		pack();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
		setVisible(true);
		setBackground(Color.black);
		
	}
} 

Menu:

public class Menu extends JPanel  implements ActionListener{
	Panel panel;
	

	public Menu(Panel panel){
		super();
		this.panel=panel;
		setPreferredSize(new Dimension(400, 420));
		setBackground(Color.black);
		setLayout(null);
		JButton start=new JButton();
		start.addActionListener(this);
		start.setBounds(125,100,150,50);
		start.setBackground(Color.BLUE);
		start.setText("START");
		start.setFont(new Font("Arial",1,20));
		start.setForeground(Color.white);
		add(start);
		
	}

	public void actionPerformed(ActionEvent e) {
		Object zdarzenie= e.getSource();
		if(e.getSource()==zdarzenie)
		{
			setFocusable(false);
			setVisible(false);
			panel.setFocusable(true);
			panel.setVisible(true);
			panel.inicjalizacja();
		
		}
	}
} 

Fragmenty gry:

public class Panel extends JPanel implements KeyListener{
...
      public Panel(){
		super();
		addKeyListener(this);
                ...
       }
...
       public void keyReleased(KeyEvent evt) {
		int key = evt.getKeyCode();
		switch (key){
		case KeyEvent.VK_LEFT:
			if (poprzedniKierunek!=1)
			kierunek=3;
			break;
		case KeyEvent.VK_RIGHT:
			if (poprzedniKierunek!=3)
			kierunek=1;
			break;
		case KeyEvent.VK_DOWN:
			if (poprzedniKierunek!=4)
			kierunek=2;
			break;
		case KeyEvent.VK_UP:
			if (poprzedniKierunek!=2)
			kierunek=4;
			break;
		}
	}
}

Co robię nie tak?

0

Menu dziedziczącej JPanel słabo mi... Ja mam wrażenie że poczatkujących w ogóle nie powinno sie uczyć że istnieje coś takiego jak dziedziczenie bo głupieją i zamiast myśleć to robią właśnie takie cuda na kiju.
Skasuj tą abominacje. Przeczytaj dowolny kurs OOP. Zacznij pisać od nowa, tym razem z głową.

0

W załączniku umieszczam cały projekt. Nie chciałem wstawiać całego kodu, bo pewnie nie jest profesjonalnie napisany i znalazłoby się więcej "pomocnych" osób jak Pan powyżej.

1

na pewno wystrzegaj się takich kwaitków

                Object zdarzenie= e.getSource();
		if(e.getSource()==zdarzenie)

Dodatkowo poczytaj o menadżerach rozkładu ;-)

będziesz miał apkę rozciągalną :)

a jeżeli chodzi o nie działający keylistner spróbuj dodać takie coś w panel inicializacja
requestFocusInWindow();

może pomoże

1

tak jak napisał @wojciechmaciejewski,
__po zawołaniu __

panel.setVisible(true);

w metodzie z ActionListenera
dodaj

panel.requestFocusInWindow();

lub w metodzie inicjalizacja samo

requestFocusInWindow();
0

Pomogło, Dzięki bardzo :)
@wojciechmaciejewski faktycznie głupi błąd, gdybym dodał więcej przycisków, pewnie bym się zorientował. A co do managera rozkładu to celowo go wyłączyłem. Jakoś wole wszystko samemu porozmieszczać :)

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