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 :

TextField avec icône


Sujet :

JavaFX

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut TextField avec icône
    Bonsoir,
    j'utilise netbeans 8 et scenebuiler 2.0 pour se familiariser avec JavaFX.
    mon application nécessite un composant TextField avec image.
    le comportement est le suivant :
    1. si la propriété texte contient une chaîne vide l'con 1 est utilisé.
    2. sinon l'con 2 qui est utilsé.

    j'ai besoin des pistes pour réaliser çà que ce soit avec l'outil scenebuilder, style css, ou avec code JavaFX.
    Images attachées Images attachées   

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Tu peux partir d'une base FXML (définissant le TextField et l'ImageView et le contrôle englobant) mais il te faudra rajouter un peu de code dans le contrôleur pour gérer le changement d'image.

    Soit les éléments suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    final Image lensIcon = new Image(getClass().getResource("Lens.png").toExternalForm());
    final Image crossIcon = new Image(getClass().getResource("Cross.png").toExternalForm());
    final ImageView imageView = new ImageView(lensIcon);
    imageView.setMouseTransparent(true);        
    StackPane.setAlignment(imageView, Pos.CENTER_RIGHT);
    final TextField textField = new TextField();
    imageView.setOnMouseClicked(mouseEvent -> textField.setText(null));
    final StackPane control = new StackPane(textField, imageView);
    control.setMinSize(-1, -1);
    control.setPrefSize(-1, -1);
    control.setMaxSize(-1, -1);
    Une première approche simple consiste à mettre un InvalidationListener ou un ChangeListener sur la propriété text du TextField :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    textField.textProperty().addListener(observable -> {
        final String text = textField.getText();
        final Image icon = (text == null || text.isEmpty()) ? lensIcon : crossIcon;
        imageView.setImage(icon);
        imageView.setMouseTransparent(icon == lensIcon);
    });
    Une seconde approche consiste à utiliser le binding de bas niveau :

    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
    imageView.imageProperty().bind(new ObjectBinding<Image>() {
        {
            bind(textField.textProperty());
        }
     
        @Override
        public void dispose() {
            unbind(textField.textProperty());
            super.dispose();
        }
     
        @Override
        protected Image computeValue() {
            final String text = textField.getText();
            final Image icon = (text == null || text.isEmpty()) ? lensIcon : crossIcon;
            return icon;
        }
    });
    imageView.mouseTransparentProperty().bind(new BooleanBinding() {
        {
            bind(imageView.imageProperty());
        }
     
        @Override
        public void dispose() {
            unbind(imageView.imageProperty());
            super.dispose();
        }
     
        @Override
        protected boolean computeValue() {
            return imageView.getImage() == lensIcon;
        }
    });
    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 habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par bouye Voir le message
    Tu peux partir d'une base FXML (définissant le TextField et l'ImageView et le contrôle englobant) mais il te faudra rajouter un peu de code dans le contrôleur pour gérer le changement d'image.
    tout d'abord, je vous remercie infiniment pour cette réponse très utile.
    j'ai utilisé votre code et il s'exécute comme il faut. mais j'ai quelques questions à vous poser:
    1- à quoi sert les trois lignes suivantes (je ne voie pas leur utilités):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    control.setMinSize(-1, -1);
    control.setPrefSize(-1, -1);
    control.setMaxSize(-1, -1);
    2- j'ai mis le code dans la méthode initialize du contrôleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        public void initialize(URL url, ResourceBundle rb) {
        final Image lensIcon = new Image(getClass().getResource("lens.png").toExternalForm());
        final Image crossIcon = new Image(getClass().getResource("cross.png").toExternalForm());  
        texte.textProperty().addListener(observable -> {
        final String text = texte.getText();
        final Image icon = (text == null || text.isEmpty()) ? lensIcon : crossIcon;
        imageView.setImage(icon);
        imageView.setMouseTransparent(icon == lensIcon);
     
    });
        }
    est ce qu'il existe une autre façon (d'autres méthodes) pour mettre ce code quelque part dans mon contrôleur.
    3- si je veux mettre ce code dans la classe Main, comment je puisse accéder aux attributs déclaré avec @FXML: j'ajoute des méthodes public get()? où bien il existe des méthodes prédéfinies permettant de faire çà.
    merci d'avance

Discussions similaires

  1. Barre d'outils avec icônes personnalisés
    Par randriano dans le forum MFC
    Réponses: 4
    Dernier message: 09/09/2007, 21h37
  2. problème avec icône de page web
    Par Sheriff dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/10/2006, 13h07
  3. TImageList avec icônes 32bits
    Par Crayon dans le forum C++Builder
    Réponses: 5
    Dernier message: 06/09/2006, 16h53
  4. DLL avec icônes
    Par The Lord of Nesquik dans le forum Windows
    Réponses: 1
    Dernier message: 03/05/2006, 15h49
  5. [VB]PB avec icône dans Systray
    Par Davidvb6 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 22/03/2006, 14h40

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