[Border JTextField] : Changement de couleur de la bordure d'un JTextField
1 réponse
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.
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]
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));
}
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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]
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)); }
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.
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.
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]
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));
}
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.
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.
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]
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)); }
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.