2017-07-25 5 views
0

Ceci est mon code:Pourquoi l'événement Mouse Pressed ne fonctionne pas dans TextArea de JavaFX?

@FXML private TextArea txtconfig; 
public void handleMousePressed(MouseEvent mouseEvent) { 
     txtconfig.setOnMousePressed(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       System.out.println("PRESSED"); 
      } 
     }); 
    } 

En FXML:

TextArea fx:id="txtconfig" style="-fx-font-size:10pt; -fx-font-family:Consolas" 
       maxWidth="Infinity" maxHeight="Infinity" VBox.vgrow="ALWAYS" 
       onMousePressed="#handleMousePressed"/> 

Cependant, setOnMouseClicked est tout garder même travaille. Seulement, onMousePressed est remplacé par onMouseClicked dans FXML.

public void handleMouseClicked(MouseEvent mouseEvent) { 
     txtconfig.setOnMouseClicked(new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event) { 
       System.out.println("Clicked"); 
      } 
     }); 

    } 
+1

Ces deux éléments sont faux: vous définissez le gestionnaire d'événements dans le gestionnaire d'événements. Donc, même dans votre version "cliquée de la souris", vous ne devriez voir le message que la deuxième fois et les suivantes lorsque vous cliquez dans la zone de texte. Je pense que la raison pour laquelle le gestionnaire pressé par la souris ne fonctionne pas du tout est que la zone de texte consomme des événements enfoncés par la souris pour une raison quelconque. Pourquoi inscrivez-vous des gestionnaires d'événements de souris de bas niveau avec une zone de texte? Qu'essayez-vous de faire? –

+0

J'essaye d'obtenir la position de caret du texte sélectionné dans le TextArea du point de la souris pressée à la souris libérée. Et oui, vous avez raison sur la version cliquée de la souris. Ce code est-il redondant? 'Txtconfig.setOnMouseClicked (new EventHandler () { @Override poignée public void (événement MouseEvent) {} });' –

+0

Oui, ce code est redondant. Mais pourquoi ne pas simplement enregistrer les écouteurs avec le ['selectionProperty'] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextInputControl.html#selectionProperty) ou le [ 'caretPositionProperty'] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextInputControl.html#caretPositionProperty) (en fonction de ce que vous voulez faire exactement), au lieu de jouer avec événements de souris? (D'une part, votre code n'a aucune chance de faire quoi que ce soit si l'utilisateur sélectionne du texte avec le clavier.) –

Répondre

0

Comme suggéré dans this answer, vous pouvez installer un ÈventFilter si vous avez vraiment besoin de l'événement MousePressed (qui semble être consommé par le contrôle lui-même):

txtconfig.addEventFilter(
    MouseEvent.MOUSE_PRESSED, 
    new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      System.out.println("PRESSED"); 
     } 
    } 
); 
+0

J'ai essayé cela plus tôt, mais je configurais le gestionnaire d'événements dans le gestionnaire d'événements comme indiqué par @James_D dans le commentaire, donc ça ne fonctionnait pas. J'ai supprimé le onMousePressed de FXML et ajouté le EventFilter dans la méthode initialize() et cela a fonctionné. Veuillez le mentionner dans votre réponse pour référence future. –