Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Border JTextField] : Changement de couleur de la bordure d'un JTextField

1 réponse
Avatar
Foub31400
Bonjour,

dans mon application, je souhaite changer la couleur de la bordure de
mes JTextField lorsque ces derniers r=E9cup=E8rent le focus, comme sur le
site de Siemens :
* champ ne disposant pas du focus : <a
href=3D"http://img182.imageshack.us/my.php?image=3Djtextfieldsansfocushf5.p=
ng">voir
image</a>
* champ ayant le focus : <a
href=3D"http://img266.imageshack.us/img266/8937/jtextfieldavecfocuswu2.th.p=
ng">voir
image</a>

D=E8s que le champ perd le focus, il doit revenir =E0 l'=E9tat initial.

En cherchant sur Internet, j'ai trouv=E9 deux classes :
ColourissingBorder et ColourisingComposite qui me permettent de changer
simplement la couleur de la bordure.

Voici la classe ColourisingBorder :

[CODE]
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 =3D border;
composite =3D 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 =3D (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 =3D new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
}
}
[/CODE]


Voici la classe ColourisingComposite :

[CODE]
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 =3D color;
}

public CompositeContext createContext(ColorModel srcColorModel,
ColorModel dstColorModel, RenderingHints hints) {
return this;
}

public void compose(Raster src, Raster dstIn, WritableRaster dstOut) {
int[] srcPixel =3D new int[4];
int[] dstPixel =3D new int[4];

for (int y =3D dstIn.getMinY(); y < dstIn.getMinY() +
dstIn.getHeight(); y++) {
for (int x =3D dstIn.getMinX(); x < dstIn.getMinX()
+ dstIn.getWidth(); x++) {
srcPixel =3D src.getPixel(x, y, srcPixel);
dstPixel[0] =3D ((srcPixel[0] * color.getRed()) >> 8) & 0xFF;
dstPixel[1] =3D ((srcPixel[1] * color.getGreen()) >> 8) & 0xFF;
dstPixel[2] =3D ((srcPixel[2] * color.getBlue()) >> 8) & 0xFF;
dstPixel[3] =3D srcPixel[3];

dstOut.setPixel(x, y, dstPixel);
}
}
}

public void dispose() {
}

}
[/CODE]

Dans une de mes classes cr=E9ant l'interface graphique, j'ai =E9crit le
code suivant :
[CODE]
private JTextField txtNom =3D new JTextField(20);

// Couleur du contour des champs et des champs proteges
private Color couleur_fond_champ =3D Color.WHITE;
private Color couleur_contour_champ =3D new Color(102, 153, 204);
private Color couleur_fond_champProtege =3D new Color(212, 231, 242);
private Color couleur_contour_champProtege =3D new Color(102, 153, 204);
private Color couleur_fond_champFocus =3D new Color(255, 255, 218);
private Color couleur_contour_champFocus =3D new Color(255, 153, 0);

.=2E..
.=2E.. puis dans la m=E9thode init(), appel=E9e par le constructeur, jai le
code suivant :
.=2E..

// J'applique au JTextField txtNom, la couleur de la bordure =AB
// couleur_contour_champ =BB
txtNom.setBackground(couleur_fond_champ);
txtNom.setBorder(new ColourisingBorder(txtNom.getBorder(),
couleur_contour_champ));
.=2Eetc.
[/CODE]

Pour faire =E9voluer la couleur de la bordure lorsque le champ gagne ou
perd le focus, j'ai =E9crit le code suivant dans une m=E9thode priv=E9e
appel=E9e =E9galement par le constructeur :
[CODE]
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));
}
}
);
[/CODE]

Le probl=E8me est que la couleur de ma bordure ne change pas et ce quel
que soit la couleur que j'essaye d'affecter =E0 mon composant.
J'ai essay=E9 de faire redessin=E9 mon composant (txtNom.repaint()), de
lui signifier que les modifications sont termin=E9es (txtNom.validate())
mais sans r=E9sultat.

Evidemment, si dans les attributs de ma classe, j'=E9crit :
[CODE]
private Color couleur_contour_champ =3D Color.RED;

au lieu de :

private Color couleur_contour_champ =3D new Color(102, 153, 204);
[/CODE]

le contour de mon champ JTextField appara=EEtra en rouge.

Mon probl=E8me est que je n'arrive pas =E0 changer la couleur de la
bordure de mon champ de saisie dynamiquement, sur le d=E9clenchement
d'un =E9v=E9nement.

Avez-vous une id=E9e et une solution ?

Merci beaucoup pour votre aide,
Fabien.

1 réponse

Avatar
Foub31400
J'ai trouvé comment faire en gardant ma solution :

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



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 : <a
href="http://img182.imageshack.us/my.php?image=jtextfieldsansfocushf5 .png">voir
image</a>
* champ ayant le focus : <a
href="http://img266.imageshack.us/img266/8937/jtextfieldavecfocuswu2.th .png">voir
image</a>

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.

Voici la classe ColourisingBorder :

[CODE]
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);
}
}
[/CODE]


Voici la classe ColourisingComposite :

[CODE]
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() {
}

}
[/CODE]

Dans une de mes classes créant l'interface graphique, j'ai écrit le
code suivant :
[CODE]
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.
[/CODE]

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]
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));
}
}
);
[/CODE]

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.

[CODE]
private Color couleur_contour_champ = Color.RED;

au lieu de :

private Color couleur_contour_champ = new Color(102, 153, 204);
[/CODE]

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.