Swing JPanel nimmt keinen KeyListener an

Guten Abend,

der KeyListener ist eher weniger das Problem, grundsätzlich funktioniert er in diesem JPanel. Aber auch nur wenn ich das JPanel in der main Klasse erzeuge:
Java:
public class Gui extends JFrame {
    
    
    public int width = 1024;
    public int height = 720;
    
    public JButton btn_play = new JButton("Spielen");
    
    public ActionHandler actionListener = new ActionHandler(this);
    
    public Menu menu;
    
    public static void main(String[] args) {
        new Gui();
    }
    
    public Gui() {
        setTitle("Spiel");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(width, height);
        setLayout(null);
        setResizable(false);
        setVisible(true);
        
        new Game(this); //<---
        
    }
}
Wenn ich aber das Objekt erst später erzeuge z.B. durch drücken eines JButtons:
Java:
public class ActionHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == gui.btn_play) {
            System.out.println("Game starting");
            gui.menu.removeMenu();
            new Game(gui);
        }
    }

}
wird das Panel zwar korrekt dargestellt, aber der KeyListener funktioniert nicht mehr...

Ich bin momentan echt ein bisschen ratlos.
Über Lösungsvorschläge wär ich sehr dankbar.
 
Mich würde einmal die Game Klasse interessieren. Du erzeugst eine neue Instanz aber speicherst die nirgends? Was genau wird da gemacht und wieso wird das nicht direkt ein Fall für den GC?
 
In der Game Klasse siehts folgendermaßen aus:
Java:
public class Game extends JPanel {
    
    private Gui gui;
    
    public Game(Gui gui) {
        this.gui = gui;
        
        this.addKeyListener(new KeyHandler(this));
        this.setFocusable(true);
        this.setLayout(null);
        this.setBackground(new Color(20, 240, 20));
        this.setBounds(gui.width/2-gui.pnl_main_width/2, 100, gui.pnl_main_width, gui.pnl_main_height);
        gui.add(this);
        
    }
 
Du gibst den KeyListener der Klasse Game. Wenn der Focus nicht auf dieser Klasse liegt wird er nicht aufgerufen.
Besser ist es den KeyListener der Klasse vom Type JFrame die die Klasse Game beinhaltet zu geben.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben