Swing JPanel nimmt keinen KeyListener an

Diskutiere JPanel nimmt keinen KeyListener an im AWT, Swing, JavaFX & SWT Bereich.
S

superhanz

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.
 
L

LimDul

Wie wird den die Variable "gui" in deinem ActionHandler initialisiert?
 
S

superhanz

Java:
private Gui gui;

public ActionHandler(Gui gui) {
    this.gui = gui;
}
 
J

JustNobody

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?
 
S

superhanz

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);
        
    }
 
Blender3D

Blender3D

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.
 
Thema: 

JPanel nimmt keinen KeyListener an

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben