Je suis en train de mettre en place un composant personnalisé où l'utilisateur peut taper dans un TextField
et un TableView
apparaît, puis l'utilisateur peut rechercher des éléments dans ce tableau.
J'ai un problème avec les événements KeyEvent
s du TextField
standard comme Ctrl+A ou Home. Après l'apparition de la fenêtre avec le TableView
, ces événements clés ne fonctionnent plus. J'ai vérifié si le TextField
avait perdu le focus mais ce n'est pas le cas, et si je définis un EventFilter
pour voir ce qui se passe, cela montre que ces événements sont déclenchés mais je ne vois aucun effet sur l'interface utilisateur. Même le setHideOnEscape
de la popup ne fonctionne pas.
Voici un code simple pour le vérifier :
Le fichier fxml :
Le contrôleur :
public class Controller implements Initializable {
@FXML
private TextField textField;
@Override
public void initialize(URL location, ResourceBundle resources) {
Popup popUp = new Popup();
TableView table = new TableView<>();
table.prefWidthProperty().bind(textField.widthProperty());
popUp.getContent().add(table);
popUp.setHideOnEscape(true);
popUp.setAutoHide(true);
// Pour voir si l'événement KeyEvent est déclenché
textField.addEventFilter(KeyEvent.ANY, System.out::println);
textField.setOnKeyTyped(event -> {
if(!popUp.isShowing()){
popUp.show(
textField.getScene().getWindow(),
textField.getScene().getWindow().getX()
+ textField.localToScene(0, 0).getX()
+ textField.getScene().getX(),
textField.getScene().getWindow().getY()
+ textField.localToScene(0, 0).getY()
+ textField.getScene().getY()
+ textField.getHeight() - 1);
}
});
}
}
Et le main :
public class Main extends Application {
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
AnchorPane pane = loader.load();
primaryStage.setScene(new Scene(pane, 800, 600));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Voici la sortie de la console
KeyEvent [source = TextField[id=textField, styleClass=text-input text-field], target = TextField[id=textField, styleClass=text-input text-field], eventType = KEY_PRESSED, consumed = false, character = , text = a, code = A]
KeyEvent [source = TextField[id=textField, styleClass=text-input text-field], target = TextField[id=textField, styleClass=text-input text-field], eventType = KEY_TYPED, consumed = false, character = a, text = , code = UNDEFINED]
KeyEvent [source = TextField[id=textField, styleClass=text-input text-field], target = TextField[id=textField, styleClass=text-input text-field], eventType = KEY_RELEASED, consumed = false, character = , text = a, code = A]
KeyEvent [source = TextField[id=textField, styleClass=text-input text-field], target = TextField[id=textField, styleClass=text-input text-field], eventType = KEY_PRESSED, consumed = false, character = , text = , code = CONTROL, controlDown, shortcutDown]
KeyEvent [source = TextField[id=textField, styleClass=text-input text-field], target = TextField[id=textField, styleClass=text-input text-field], eventType = KEY_TYPED, consumed = false, character = , text = , code = UNDEFINED, controlDown, shortcutDown]
KeyEvent [source = TextField[id=textField, styleClass=text-input text-field], target = TextField[id=textField, styleClass=text-input text-field], eventType = KEY_RELEASED, consumed = false, character = , text = a, code = A, controlDown, shortcutDown]
KeyEvent [source = TextField[id=textField, styleClass=text-input text-field], target = TextField[id=textField, styleClass=text-input text-field], eventType = KEY_RELEASED, consumed = false, character = , text = , code = CONTROL]
Une idée de pourquoi ces événements sont consommés même s'il est dit qu'ils ne le sont pas ?