IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

comment récupérer l'id du textfield qui déclenche mon listener


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut comment récupérer l'id du textfield qui déclenche mon listener
    Bonjour,

    J'ai fais un exemple tout simple qui contient un textField et un comboBox.

    Je crée un ChangeListener que je mets à la fois sur mon textField et sur mon combo

    Quand le listener se déclenche sur l'un ou sur l'autre, j'arrive à voir sur la console, l'id soit du textField, soit du combo.
    Je voudrais trouver un moyen de récupérer l'id du contrôle qui a déclenché le listener, mais impossible....

    En débug, je l'arrête dans mon listener et quand j'examine mon observableValue "o", je trouve l'id recherché dans :
    o
    this$0
    id
    value
    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    package application;
     
    import javafx.application.Application;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.stage.Stage;
    import javafx.scene.Scene;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.BorderPane;
     
     
    public class Main extends Application {
    	@Override
    	public void start(Stage primaryStage) {
    		try {
     
    			TextField monTextField = new TextField();
    			monTextField.setId("quelEstLeNomDeCeTextField");
     
    			ComboBox MonCombo = new ComboBox();
    			MonCombo.setId("quelEstLeNomDeCeCombo");
     
    			ObservableList<String> data = FXCollections.observableArrayList();
    			data.addAll("toto","titi");
     
    			MonCombo.setItems(data);
     
     
    			ChangeListener changedField = new ChangeListener (){
    				@Override
    				public void changed(ObservableValue o, Object oldVal, Object newVal){
    					System.out.println(o.toString());
    					//me retourne quand je clique le combo:
    					//ObjectProperty [bean: ComboBox[id=quelEstLeNomDeCeCombo, styleClass=combo-box-base combo-box], name: value, value: toto]
     
    					//et quand je tape un caractère dans le textBox
    					//StringProperty [bean: TextField[id=quelEstLeNomDeCeTextField, styleClass=text-input text-field], name: text, value: a]
     
    					//en debug je trouve le nom dans o.this.id.value
     
    				}			
    			};
     
     
     
    			MonCombo.setLayoutY(20);
     
     
    			monTextField.textProperty().addListener(changedField);
    			MonCombo.valueProperty().addListener(changedField);
     
     
     
     
     
     
     
     
     
    			AnchorPane root = new AnchorPane();
     
    			root.getChildren().addAll(monTextField, MonCombo);
     
    			Scene scene = new Scene(root,400,400);
    			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
    			primaryStage.setScene(scene);
    			primaryStage.show();
    		} catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
     
    	public static void main(String[] args) {
    		launch(args);
    	}
    }
    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Tu ne la trouveras pas hélas, en regardant le code source on a pour la ComboBox dans ComboBoxBase :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public ObjectProperty<T> valueProperty() { return value; }
     
    private ObjectProperty<T> value = new SimpleObjectProperty<T>(this, "value");
    Donc on a bien une référence au bean source.

    Mais pour TextField on a à la place dans TextInputControl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private TextProperty text = new TextProperty();
     
    public final StringProperty textProperty() { return text; }
     
    private class TextProperty extends StringProperty {
     
        // Utilise le constructeur par défaut implicite.
     
        [...]
    Or cette classe interne TextProperty ne référence pas son bean source.

    Donc à faire :
    • Créer un écouteur spécifique pour le champs textuel.
    • OU : comparer o avec monTextField.textProperty() ce qui permettra de voir que ce champs est bien l'émetteur.
    • ENSUITE : faire un bug report ou un enhancement request pour que cette propriété conserve une référence sur son bean parent. Hélas en regardant le code source, c'est loin d'être la seule et j'ignore vraiment pourquoi c'est ainsi (pour faciliter le passage du ramasse-miette ou réduire l'empreinte mémoire ? ).



    EDIT - correction du coup après plus de tests cette propriété conserve bien une référence sur son bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    System.out.println(o.toString());
    if (o instanceof Property) {
        final Property property = (Property) o;
        final Object bean = property.getBean();
        if (bean instanceof Node) {
            final Node node = (Node) bean;
            System.out.println(node.getId());
        }
    }
    En effet, elle surcharge getBean() plus bas dans sa définition (je n'étais pas allé jusque là) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Override public Object getBean() {
                return TextInputControl.this;
            }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Bonjour,

    Merci pour cette super réponse.

    J'avais bien trouvé comment récupérer l'ID via les lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ChangeListener declencheurTxtFieldListener = new ChangeListener(){			
    			@Override
    			public void changed(ObservableValue o, Object oldVal, Object newVal){					
    					StringProperty myStrPty= (StringProperty) o;
    					TextField myTextField = (TextField) myStrPty.getBean();
    					System.out.println("j'ai changé une valeur dans " + myTextField.getId());
     
    			}
    		};
    Mais ce code ne s'applique qu'au TextField et j'aurais du faire d'autres Listener pour les comboBox ou autres...

    Ton code à l'avantage d'être générique. C'est de la haute voltige

    Ca fonctionne pour mes combo et textFields.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/12/2015, 21h10
  2. Réponses: 2
    Dernier message: 18/02/2012, 17h56
  3. comment récupérer le nom des jobs qui roulent
    Par DEV-10 dans le forum Administration
    Réponses: 3
    Dernier message: 05/09/2009, 10h45
  4. Réponses: 2
    Dernier message: 14/09/2006, 18h53
  5. Réponses: 1
    Dernier message: 14/09/2006, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo