2017-01-07 3 views
1

Est-il possible de désactiver arrow key écouteurs dans TextArea lorsqu'il a le focus. Je pense surtout à déplacer le scrollpane avec eux quand il y a plus de texte que d'espace dans la zone. J'essaie d'éviter ça.JavaFX textarea listeners

Merci pour votre suggestion.

Répondre

2

Vous pouvez utiliser un filtre d'événement. Les filtres reçoivent des événements pendant la phase de capture d'événement (1er, en bas du graphe de scène) du traitement des événements, tandis que les gestionnaires sont déclenchés pendant la phase de bouillonnement de l'événement (2e, graphique de la scène). Jetez un oeil à cet extrait:

TextArea textArea = new TextArea(); 
textArea.addEventFilter(KeyEvent.ANY, event -> { 
    KeyCode code = event.getCode(); 
    boolean isArrowKey = code == KeyCode.UP || code == KeyCode.RIGHT 
      || code == KeyCode.DOWN || code == KeyCode.LEFT; 
    if (isArrowKey) { 
     event.consume(); 
    } 
}); 

La méthode consume() arrête la propagation ultérieure de l'événement. Par conséquent, aucun écouteur (événement clé) ne sera déclenché. Mais cela désactive également la possibilité de naviguer à travers les touches fléchées - est-ce vraiment ce que vous voulez?

EDIT: en ce qui concerne your comment, this answer états:

Le comportement de commande des barres de défilement est interne codé dans le TextAreaSkin (qui en Java 8 ne fait pas partie de l'API JavaFX public). Vous pouvez copier ou sous-classer TextAreaSkin pour personnaliser son comportement, puis attach your customized skin to your node. C'est vraiment le "bon" moyen de personnaliser le comportement du contrôle interne de la manière dont vous le souhaitez.

+0

Pas exactement. Je veux désactiver ces écouteurs particuliers qui font bouger le scrollpane dans 'TextArea' avec des flèches mais qui veulent avoir mes propres événements onKeyPressed avec eux. En ce moment j'ai l'action implémentée par moi-même + de JavaFX Api ensemble. Le point est d'éteindre le second. J'espère que c'est plus clair maintenant. – Saris

+0

@Saris merci pour clarifier, édité ma réponse. – beatngu13

+2

La fonction 'if (textArea.isFocused())' est redondante: la zone de texte ne déclenchera pas l'événement key si elle n'est pas mise au point. @Saris Ce n'est pas vraiment clair pourquoi cela ne fait pas ce que vous voulez. Ajoutez simplement votre propre fonctionnalité dans le bloc 'if (isArrowKey)'. –