2017-04-08 4 views
0

Je suis super confus en ce moment. J'ai créé un volet dans le code fxml et défini un événement onKeyPressed.KeyEvents et Focus JavaFX

pane.setOnKeyPressed(new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     System.out.println("I'm here"); 
     jump(event); 
    } 
}); 

Cela n'a pas fonctionné. Le volet n'a capturé aucun KeyEvents. Jamais imprimé "Je suis ici". Ensuite, je voulais régler la onKeyPressed de la scène, qui fonctionne, mais je dois le faire dans le contrôleur car les choses que je veux gérer pendant une pression de touche doivent être faites dans le contrôleur.

Puis j'ai appelé pane.getScene().setOnKeyPressed() mais cela a donné un nullPointerException, comme j'ai découvert que je dois l'appeler en dehors de initialize().

J'ai donc créé un bouton et lui ai attaché un événement onAction, qui imprime la Scene of my Pane, pour essayer si cela fonctionne vraiment. Lorsque j'ai cliqué sur le bouton, j'ai imprimé la Scene of my Pane comme il se doit. Mais ensuite, j'ai réalisé que mon Pane attrape maintenant KeyEvents. Je n'ai rien changé, sauf ajouter un bouton en utilisant Fxml et maintenant le volet attrape KeyEvents? Quand je commente le code pour le bouton, le volet ne se coince pas KeyEvents plus

<Button onAction="#printScene"/> 

C'est tout le code que j'ai pour le bouton.

Remarque: J'ai également essayé pane.requestFocus() et pane.SetFocusTraversable(true) qui ne fonctionnait pas non plus. Mais ajouter un bouton le fait soudainement fonctionner? Je suis tellement confus.

CODE ENTIER:

public class Main extends Application { 

@Override 
public void start(Stage primaryStage) throws Exception{ 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("sample.fxml")); 
    Parent root = fxmlLoader.load(); 
    Scene scene = new Scene(root, 800, 600); 
    primaryStage.setTitle("Game"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 


} 

public static void main(String[] args) { 
    launch(args); 
} 
} 

public class Controller { 

@FXML private Pane pane; 
@FXML private Rectangle cube; 

public void initialize() { 
    pane.requestFocus(); 
    pane.setFocusTraversable(true); 
    pane.setOnKeyPressed(new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent event) { 
      System.out.println("I'm here"); 
      jump(event); 
     } 
    }); 
    System.out.println(pane.getScene()); 
} 
} 

//FXML Code 
<Pane fx:controller="sample.Controller" fx:id="pane" 
    xmlns:fx="http://javafx.com/fxml"> 

<Rectangle width="800" height="20" layoutY="580" fill="green"/> 
<Rectangle fx:id="cube" width="40" height="40" layoutX="5" layoutY="540"/> 
<!--<Button />--> 
</Pane> 

bouton décommentant fait mise au point de gain volet, et vice versa.

+0

Vous ne savez pas pourquoi l'ajout du bouton donne la priorité au volet ou pourquoi 'pane.requestFocus()' n'a pas fonctionné (vous devez publier un [MCVE] pour obtenir une réponse). Le meilleur moyen de le faire est d'enregistrer un auditeur sur la scène, ce que vous pouvez faire où vous créez la scène. À ce stade, il devrait être possible d'obtenir une référence au contrôleur, de sorte que vous pouvez appeler une méthode sur le contrôleur depuis le gestionnaire. –

+0

Je vais poster tout le code dès que possible, merci pour l'aide. Aussi j'ai appelé requestFocus dans la méthode initialize(), peut-être c'est pourquoi ça n'a pas fonctionné? – Random

+0

@James_D J'ai posté tout le code. Je serais heureux si vous pouviez jeter un coup d'oeil ^^ – Random

Répondre

0

Ceci est ma première réponse sur ce site, donc je ne peux pas être très bon pour vous répondre.

Quoi qu'il en soit, je pense que l'erreur est appliquant l'événement sur le volet, essayez de l'appliquer sur la scène. J'ai vu que vous utilisez pane.getScene(); Vous n'avez pas l'objet scène?

+0

Je sais que le volet n'a pas l'accent, c'est pourquoi j'ai demandé la focalisation, qui n'a pas fonctionné. L'appliquer sur la scène fonctionnerait mais ce que je me demande est pourquoi il commence à travailler avec l'ajout d'un bouton. – Random

+0

Essayez d'imprimer le contenu du volet avant et après la création du bouton. Peut-être que la scène n'est pas vraiment initialisée tant que vous n'avez pas créé le bouton. –

+0

Commentant rien d'autre mais le