# Den KeyListener in einer JavaFXML Application benutzen



## Blacknico (13. Dez 2014)

Liebe Java-Forum Community

Ich habe bereits einige Foren durchgestöbert, mich in YouTube, Google und  hier versucht schlau zu machen, jedoch vergebens.
Die Beiträge die ich für den KeyListener gefunden habe sind alle für Java Swing und nicht für eine FXML Application gedacht.
Ich habe die Beispiele die mir vorgeschlagen durchprobiert, aber leider hat keines dieser so funktioniert wie ich es mir erhofft hatte.

So nun zu meinem genauen Problem:

Ich bin dabei ein Art Jump'n'Run zu entwickeln. Beim auswählen der Pfeiltasten(Hoch, Runter) soll sich die Figur beim drücken nach oben bewegen. Dazu habe ich wie vorgeschrieben, die "keyPressed(KeyEvent e"- Methode benutzt. In diesem Beispiel möchte ich nur das gedrückte in der Konsole ausgeben um zu testen ob er die Methode überhaupt ausführt. 

KeyHandler Klasse:

```
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyHandler implements KeyListener {
    
    @Override
    public void keyPressed(KeyEvent e) {
        if ( e.getKeyCode() == KeyEvent.VK_DOWN ){
            System.out.println("Unten");
        }
        if ( e.getKeyCode() == KeyEvent.VK_UP ){
            System.out.println("Oben");
        }
        if ( e.getKeyCode() == KeyEvent.VK_LEFT ){
            System.out.println("Links");
        }
        if ( e.getKeyCode() == KeyEvent.VK_RIGHT ){
            System.out.println("Rechts");
        }
        System.err.println("Ich bin drin aber es wurde nichts gedrückt");
    }
}
```

Da man in einer FXML Application immer einen Controller des jeweiligen FXMLs besitzt, muss ich das jetzt irgendwie mit dem Controller verbinden.
Jedoch weiss ich leider nicht genau wie ich das anstellen soll. Das Einzige was in dem Controller ausgeführt wird ist die "initialize"-Methode:

```
@Override
    public void initialize(URL url, ResourceBundle rb) {
        
        background2.setX(1700);
        background.setX(0);
    
        MoveBackground();
          
    }
```

Das MoveBackground verschiebt nur den Hintergrund.
Ich weiss das ich es mit "addKeyListener(KeyEvent keyEvent)" dem Fenster übergeben kann, nur will er dann eine Methode generieren, die eine Unsupported Operation Exeption haben möchte.

Wie kann ich nun den KeyListener in meiner Application aufrufen, ohne das er mir eine "NullPointerException" oder eine Methode mit der "Unsupported Operation Exeption"


----------



## dzim (15. Dez 2014)

Ich weiss jetzt noch nicht genau, ob ich es korrekt verstehe, aber wenn ich in meinem FXML einen Controller mit *fx:controller="my.package.MyController"* angegeben habe, dann kann ich dort ja einen Event Handler für Key-Events deklarieren (also onKeyReleased="#onKeyReleased", *#onKeyReleased*, *#onKeyTyped*), indem ich z.B. *onKeyReleased="#myOnKeyReleasedHandler"* einfüge (die Methode *#myOnKeyReleasedHandler(KeyEvent)* wäre dann im Controller für die Verarbeitung aller Events in dem Fokus verantwortlich). Im Controller hättest du dann so eine Methode hier:

```
@FXML 
public void myOnKeyReleasedHandler(KeyEvent event) {
    // TODO implement behaviour
    // use event.consume(); if you want to prevent the event bubbling into the parent UI container
}
```

#edit:
War es das, was du meintest?


----------



## Blacknico (17. Dez 2014)

Nicht ganz
Aber trotzdem Danke  ich habe eine Möglichkeit gefunden wie es noch geht.

Das hier habe ich jetzt in die "Main" geschrieben


```
scene.setOnKeyPressed(new EventHandler<javafx.scene.input.KeyEvent>() {

            @Override
            public void handle(javafx.scene.input.KeyEvent t) {
                switch(t.getCode()){
                    case W: InGameController.ChangeLaneUp();                  
                    break;
                    case S: InGameController.ChangeLaneDown();
                    break;
                }
            }
        });
```


----------

