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

Composants Java Discussion :

[JTextField] : Changement de couleur de la bordure


Sujet :

Composants Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut [JTextField] : Changement de couleur de la bordure
    Bonjour,

    dans mon application, je souhaite changer la couleur de la bordure de mes JTextField lorsque ces derniers récupèrent le focus, comme sur le site de Siemens :
    * champ ne disposant pas du focus : Nom : JTextField_sansFocus.png
Affichages : 1777
Taille : 993 octets
    * champ ayant le focus : Nom : JTextField_avecFocus.png
Affichages : 1780
Taille : 1,1 Ko

    Dès que le champ perd le focus, il doit revenir à l'état initial.

    En cherchant sur Internet, j'ai trouvé deux classes : ColourissingBorder et ColourisingComposite qui me permettent de changer simplement la couleur de la bordure sans modifier la marge par défaut.

    Voici la classe ColourisingBorder :

    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
     
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Composite;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import java.awt.image.BufferedImage;
     
    import javax.swing.border.Border;
     
    public class ColourisingBorder implements Border {
    	// Composite used to colourise the rendering
    	private Composite composite;
     
    	// The border that we're colourising
    	private Border border;
     
    	private BufferedImage image;
     
    	public ColourisingBorder(Border border, Color color) {
    		this.border = border;
    		composite = new ColourisingComposite(color);
    	}
     
    	public boolean isBorderOpaque() {
    		return border.isBorderOpaque();
    	}
     
    	public Insets getBorderInsets(Component comp) {
    		return border.getBorderInsets(comp);
    	}
     
    	public void paintBorder(Component comp, Graphics g, int x, int y,
    			int width, int height) {
    		clearImage(width, height);
     
    		// Change the graphics so that it colourises its output when drawing
    		Graphics2D g2 = (Graphics2D) image.getGraphics();
    		g2.setComposite(composite);
    		// Paint the underlying border with the composite applied onto our
    		// buffer image
    		border.paintBorder(comp, g2, 0, 0, width, height);
    		g2.dispose();
     
    		// Paint our buffer image onto the "screen"
    		g.drawImage(image, x, y, width, height, 0, 0, width, height, null);
    	}
     
    	private void clearImage(int width, int height) {
    		// TODO - Optimise this so it just clears the image rather than creates
    		// a new one!
    		image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    	}
    }

    Voici la classe ColourisingComposite :

    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
     
    import java.awt.Color;
    import java.awt.Composite;
    import java.awt.CompositeContext;
    import java.awt.RenderingHints;
    import java.awt.image.ColorModel;
    import java.awt.image.Raster;
    import java.awt.image.WritableRaster;
     
    public class ColourisingComposite implements Composite, CompositeContext {
     
    	private Color color;
     
    	public ColourisingComposite(Color color) {
    		this.color = color;
    	}
     
    	public CompositeContext createContext(ColorModel srcColorModel,
    			ColorModel dstColorModel, RenderingHints hints) {
    		return this;
    	}
     
    	public void compose(Raster src, Raster dstIn, WritableRaster dstOut) {
    		int[] srcPixel = new int[4];
    		int[] dstPixel = new int[4];
     
    		for (int y = dstIn.getMinY(); y < dstIn.getMinY() + dstIn.getHeight(); y++) {
    			for (int x = dstIn.getMinX(); x < dstIn.getMinX()
    					+ dstIn.getWidth(); x++) {
    				srcPixel = src.getPixel(x, y, srcPixel);
    				dstPixel[0] = ((srcPixel[0] * color.getRed()) >> 8) & 0xFF;
    				dstPixel[1] = ((srcPixel[1] * color.getGreen()) >> 8) & 0xFF;
    				dstPixel[2] = ((srcPixel[2] * color.getBlue()) >> 8) & 0xFF;
    				dstPixel[3] = srcPixel[3];
     
    				dstOut.setPixel(x, y, dstPixel);
    			}
    		}
    	}
     
    	public void dispose() {
    	}
     
    }
    Dans une de mes classes créant l'interface graphique, j'ai écrit le code suivant :
    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
     
    private JTextField txtNom = new JTextField(20);
     
    // Couleur du contour des champs et des champs proteges
    private Color couleur_fond_champ = Color.WHITE;
    private Color couleur_contour_champ = new Color(102, 153, 204);
    private Color couleur_fond_champProtege = new Color(212, 231, 242);
    private Color couleur_contour_champProtege = new Color(102, 153, 204);
    private Color couleur_fond_champFocus = new Color(255, 255, 218);
    private Color couleur_contour_champFocus = new Color(255, 153, 0);
     
    ....
    .... puis dans la méthode init(), appelée par le constructeur, jai le code suivant :
    ....
     
    // J'applique au JTextField txtNom, la couleur de la bordure « 
    // couleur_contour_champ »
    txtNom.setBackground(couleur_fond_champ);
    txtNom.setBorder(new ColourisingBorder(txtNom.getBorder(), couleur_contour_champ));
    ..etc.
    Pour faire évoluer la couleur de la bordure lorsque le champ gagne ou perd le focus, j'ai écrit le code suivant dans une méthode privée appelée également par le constructeur :
    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
     
    txtNom.addFocusListener( 
    	new FocusListener() {
    		public void focusGained(FocusEvent e) {
    			txtNom.setBackground(couleur_fond_champFocus);
    			//txtNom.setBorder(new ColourisingBorder(txtNom.getBorder(), couleur_contour_champFocus));
    			txtNom.setBorder(new ColourisingBorder(txtNom.getBorder(), Color.RED));
    		}
     
    		public void focusLost(FocusEvent e) {
    			txtNom.setBackground(couleur_fond_champ);
    			txtNom.setBorder(new ColourisingBorder(txtNom.getBorder(), couleur_contour_champ));
    		} 
    	}
    );
    Le problème est que la couleur de ma bordure ne change pas et ce quel que soit la couleur que j'essaye d'affecter à mon composant.
    J'ai essayé de faire redessiné mon composant (txtNom.repaint()), de lui signifier que les modifications sont terminées (txtNom.validate()) mais sans résultat.

    Evidemment, si dans les attributs de ma classe, j'écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private Color couleur_contour_champ = Color.RED;
     
    au lieu de :
     
    private Color couleur_contour_champ = new Color(102, 153, 204);
    le contour de mon champ JTextField apparaîtra en rouge.

    Mon problème est que je n'arrive pas à changer la couleur de la bordure de mon champ de saisie dynamiquement, sur le déclenchement d'un événement.

    Avez-vous une idée et une solution ?

    Merci beaucoup pour votre aide,
    Fabien.

  2. #2
    Membre habitué Avatar de dr00w
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 116
    Points : 136
    Points
    136
    Par défaut
    Et avec quelque chose genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JTextField text1 = new JTextField("toto", 20);
    text1.setBorder(BorderFactory.createLineBorder(Color.RED));

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut
    Dans ce cas, on perd la marge par défaut...
    et on a le texte directement collé à la bordure, ce qui n'est pas très joli...

  4. #4
    Membre habitué Avatar de dr00w
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 116
    Points : 136
    Points
    136
    Par défaut
    La démo de validation de JGoodies http://www.jgoodies.com/downloads/index.html contient des idées intéressantes quoique p-e pas si simple a implémenter. Ça vaudrait p-e la peine de regarder le source :http://www.jgoodies.com/downloads/libraries.html

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Sinon une CoumpoundBorder contenant un LineBorder et une EmptyBorder pourrait faire l'affaire

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut
    je vais essayer de regarder ces libs
    Merci beaucoup ;-)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut
    J'ai trouvé comment faire en gardant ma solution :

    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
     
    myFocusListener = new FocusListener() {
    	public void focusGained(FocusEvent e) {
    		instance.setBackground(couleur_fond_champFocus);
     
    		// Changement de la couleur de la bordure 
    		ColourisingBorder b = (ColourisingBorder)instance.getBorder();
    				b.getComposite().setColor(couleur_contour_champFocus);
    	}
     
    	public void focusLost(FocusEvent e) {
    		instance.setBackground(couleur_fond_champ);
     
    		// Changement de la couleur de la bordure
    		ColourisingBorder b = (ColourisingBorder)instance.getBorder();
    		b.getComposite().setColor(couleur_contour_champ);
    	} 
    };
    Il suffit de ne pas recréer un objet ColourisingBorder mais de changer la couleur directement dans l'objet ColourisingBorder.
    Pour cela, j'ai modifié l'objet pour pouvoir accéder à l'objet ColourisingComposite. J'ai du rajouté un setter pour la couleur afin de modifier directement la couleur de la bordure.

    Merci à tous.
    Fabien

  8. #8
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Foub pourrais tu me donner tes méthodes getComposite() et setColor() stp ? c'est pile ce qu'il me faut

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/01/2007, 22h14
  2. Réponses: 3
    Dernier message: 12/11/2006, 05h12
  3. Changement de couleur d'un libellé sur OnClick
    Par maysa dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/11/2005, 16h29
  4. Changement de couleur quand j'affiche du texte...
    Par MaxPayne dans le forum OpenGL
    Réponses: 3
    Dernier message: 10/12/2004, 14h55
  5. Comment changer seulement la couleur de la bordure ?
    Par jer_the_one dans le forum Composants VCL
    Réponses: 16
    Dernier message: 12/08/2004, 15h39

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