KeyEvent funktioniert nicht, wenn Buttons dem Frame hinzugefügt werden

Schulprogrammierer

Neues Mitglied
Hallo,
ich programmiere Snake in Eclipse und es läuft schon, allerdings will ich jetzt Buttons für eine Pause und für das Schließen von dem Spiel auf das Spielfeld hinzufügen. Wenn ich diese jedoch dann dem Frame hinzufüge, reagiert das Spiel nicht mehr auf die Pfeiltasten. Ohne die zwei Buttons reagiert das Spiel immer auf die Pfeiltasten.

Code:
start = new JButton("Starten");
        stopp = new JButton("Schließen");
        start.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent x){
                if(on==true){
                    on=false;
                    start.setText("Starten");
                }
                else{
                    on=true;
                    start.setText("Pause");
                }
            }
        });
       
        stopp.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent x){
                System.exit(0);
            }
        });
        zeile.add(start);
        zeile.add(stopp);
        zeile.add(label);
        ordnung.add(zeile);
        ordnung.add(spielfeld);
        setContentPane(ordnung);
        pack();

ordnung ist eine Boy, spielfeld und zeile ein JPanel.
Außerdem ist die Klasse Gitternetz, in der der obere Code geschrieben steht, von einem JFrame abgeleitet.

Code:
public class KeyEventClass implements KeyListener{
    private int wohin;
    public KeyEventClass(){
        wohin = 1;
    }
    public void keyPressed( KeyEvent e ){
        switch (wohin){
        case 1:
            if( e.getKeyCode()== KeyEvent.VK_RIGHT ){
                wohin = 3;
            }
            else if( e.getKeyCode() == KeyEvent.VK_LEFT ){
                wohin = 4;
            }break;
        case 2:
            if( e.getKeyCode()== KeyEvent.VK_RIGHT ){
                wohin = 3;
            }
            else if( e.getKeyCode() == KeyEvent.VK_LEFT ){
                wohin = 4;
            }break;
        case 3:
            if ( e.getKeyCode() == KeyEvent.VK_UP ){
                wohin=1;
            }
            else if( e.getKeyCode() == KeyEvent.VK_DOWN ){
                wohin = 2;
            }break;
        case 4:
            if ( e.getKeyCode() == KeyEvent.VK_UP ){
                wohin=1;
            }
            else if( e.getKeyCode() == KeyEvent.VK_DOWN ){
                wohin = 2;
            }break;
        default : wohin = 1; break;
        }
    }
    public void keyReleased( KeyEvent e ) {}
    public void keyTyped( KeyEvent e ) {}
   
    public int getWohin(){
        return wohin;
    }
}

Es kann sein, dass dieser Code umständlich ist, aber darum geht es erstmal nicht. In der Hauptklasse schreibe ich ObjektvonFrame.addKeyListener(ObjektvonKeyEventClass); in den Konstruktor.

Warum funktioniert das mit dem KeyListener nur ohne Buttons, mit jedoch nicht?
 
Wahrscheinlich hat jetzt einer der Buttons den Fokus, so dass er die Tastenschläge empfängt und nicht mehr der Frame. Du könntest versuchen, zu verhindern, dass die Buttons den Fokus bekommen oder den Buttons denselben KeyListener hinzufügen.
 
Wie @Meniskusschaden schon sagte:
Das wird daran liegen, weil deine Buttons den Fokus haben und eben nicht mehr den Panel. Mit der Methode

Java:
setFocusable(true);

kannst du bestimmen welches Objekt jetzt den Fokus haben soll.

von einem JFrame abgeleitet.

Gewöhn dir ab eine Klasse mit JFrame zu extenden, wenn du die Funktionalität der JFrame Klasse nicht erweitern willst.
Wenn du wirklich nur ein JFrame erstellen willst, dann reicht auch eine Instanze von JFrame 🙂

Gruß
 
Ja, genau, du musst den Focus auf das Objekt setzen welches den KeyListener beinhaltet.
Meines Wissens gab es da (Zumindest für ein JPanel) extra die Methode "requestFocus", welche logischer weise nur funktioniert wenn vorher "setFocusable()" auf true gesetzt wurde bzw. es default auf true war.

Mfg Major
 
sorry kenn mich hier noch net so aus


Also ich habe es bei mir mal mit "setFocusable(true)" auf mein JFrame versucht und dennoch will der Keylistener nicht wie ich will
 
Javandy würde dir raten einen neuen, eigene Post zu machen und ein bisschen Code zu zeigen, Ansonsten kAnn man dir nicht helfen 🙂
 

Zurück
Oben