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



## Schulprogrammierer (1. Nov 2016)

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.


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


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


----------



## Meniskusschaden (1. Nov 2016)

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.


----------



## VfL_Freak (2. Nov 2016)

Schulprogrammierer hat gesagt.:


> ordnung ist eine Boy


verstehe .....


----------



## Robat (2. Nov 2016)

Wie @Meniskusschaden schon sagte: 
Das wird daran liegen, weil deine Buttons den Fokus haben und eben nicht mehr den Panel. Mit der Methode 


```
setFocusable(true);
```

kannst du bestimmen welches Objekt jetzt den Fokus haben soll.



Schulprogrammierer hat gesagt.:


> 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ß


----------



## Schulprogrammierer (2. Nov 2016)

Danke @Meniskusschaden und @Robat, ich muss also den Fokus auf das Panel oder das Frame legen? @VfL_Freak :
Ich meinte natürlich eine Box!


----------



## Major_Sauce (3. Nov 2016)

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


----------



## javandy (6. Nov 2016)

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


----------



## Robat (6. Nov 2016)

Javandy würde dir raten einen neuen, eigene Post zu machen und ein bisschen Code zu zeigen, Ansonsten kAnn man dir nicht helfen


----------

