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.
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. –
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
@James_D J'ai posté tout le code. Je serais heureux si vous pouviez jeter un coup d'oeil ^^ – Random