# Java > Interfaces Graphiques en Java > AWT/Swing >  [SWING] Modifier l'apparence de certains composants

## rprom1

Bonjour  tous!
Voil, je suis en train de dvelopper une nouvelle interface Java et j'aurais voulu modifier l'apprence de certains composants de mon interface... je m'explique: je voudrais par exemple arrondir les angles de mes boutons ou encore arrondir les onglets de mon JTabbedPane!

En fait, au dbut je voulais utiliser un nouveau Look and Feel mais le problme est que je ne veux pas changer l'apparence de tous mes composants donc j'aurais voulu savoir dans un premier temps si c'tait possible et si il existait des mthodes qui permettent cela? J'aurais donc voulu me passer d'un nouveau Look and feel... 
Si ce que je demande n'est pas possible, pouvez vous me donner des conseils (par exemple sur la faon de crer son propre Look and Feel)?

Merci d'avance et bon aprs-midi  tous...

----------


## Gfx

Tu peux faire des "bouts" de look and feel. Le plus simple est d'tendre une des classes *UI. Par exemple pour un bouton, BasicButtonUI ou MetalButtonUI. Ensuite il faudra faire monBouton.setUI(MaButtonUI.getUI()). Il y a tout un tas de dtails mais c'est en gros la solution la plus rutilisable.

Une autre solution, que j'affectionne particulirement, est d'tendre les composants Swing et de surcharger leur mthode paintComponent(). Cette technique est cependant parfois difficile pour des composants complexes. De plus cela ne permet pas de modifier des composants composs. Par exemple un JScrollPane contient des JScrollBar. Pour changer l'apparence de ces dernires il est bien plus facile de passer par un dlgu d'UI (les *UI mentionnes prcdemment).

J'ai crit un article sur le sujet qui se trouve l-dedans : http://www.progx.org/users/Gfx/articles/java.zip

Cherche l'article situ dans le dossier "GUI". Il est court mais prsente un exemple de dlgu.

Dans peu de temps maintenant, Sun et moi-mme allons diffuser le code source de l'application dont tu peux voir des captures ci-dessous :









Pour crer cette interface j'ai utilis les deux techniques cites prcdemment suivant mes besoins. Les boutons sont par exemples des classes qui hritent de JButton. Les barres de dfilement utilisent au contraire des dlgus d'UI. Cela devrait faire un bon exemple pour montrer comment crer une interface vraiment personnalise en Swing  ::):  

Parmi les composant Swing utiliss dans ces captures il y a : JButton, JList, JPanel, JScrollBar, JScrollPane, JTextField, JSlider et JFrame.

----------


## rprom1

OK, merci pour tes explications!

Par contre, je ne vois pas exactement comment faire pour faire des "bouts" de L&F... tu me dis par exemple d'tendre la classe MetalButtonUI mais c'est l que ne vois pas comment faire! Tu peux m'aider? Ou me donner un tout petit exemple?

Merci beaucoup...

----------


## spekal

Je rebondis par rapport  tout ce que dit Gfx...

Et qu'en est-il par rapport  l'usage du Look&Feel Synth ? Qu'en penses-tu ? Est-ce une approche possible pour faire ce que cherche rprom, et dans ce cas pourquoi ne l'as-tu pas employ dans ton appli ?

----------


## Gfx

Parce que j'ai boss sur Synth pendant un an chez Sun et que j'en avais marre de l'utiliser alors j'ai fait autrement  ::):  Je voulais en outre essayer une autre approche, par injection de ressource. Le rsultat est le projet Fuse : http://fuse.dev.java.net

Exemple d'utilisation de Fuse ici : http://www.jroller.com/page/gfx?entry=fuse_swing_demo

----------


## spekal

Mais,  part le fait qu'on en ait marre de Synth aprs un an de travail dessus, penses-tu que ce soit une bonne approche, disons, les 6 premiers mois ? Quels sont ces avantages et inconvnients, tels que tu les a vus , disons, 10 mois de travail ? (plaons nous tout de mme avant la phase de rejet  ::D:  )

----------


## Gfx

J'en avais marre non pas en tant qu'utilisateur de Synth, mais en tant que dveloppeur de Synth, c'est diffrent ;-)

Je pense que Synth est une trs bonne approche pour faire une nouvelle apparence pour une application, surtout quand il s'agit de branding pour un client. Avec un designer et un dveloppeur on doit pouvoir faire un look Synth complet et de qualit en 2/3 semaines. L'inconvnient de Synth, qui n'en est pas vraiment un puisque ce n'est pas son rle, est qu'il ne permet pas de modifier le feel des applications, juste le look. Synth demande aussi une bonne connaissance de Swing. Par exemple pour modifier l'apparence d'une combo box, il faut modifier l'apparence d'un textfield, d'un arrowbutton, d'un popupmenu et d'une scrollbar (lis mon blog sur comment faire une scrollbar pour mieux comprendre ce que je veux dire : http://www.jroller.com/page/gfx?entry=synth_subtleties)

Je te conseille de jeter un oeil  Synthetica. Ce projet (dispo en versions non commerciale gratuite et commerciale payante) apporte  Java 1.5 toutes les corrections et modifications que nous avons implment dans Java 1.6. L'auteur propose aussi pas mal de skin trs jolies. Cela permet de dmarrer sur de bonnes bases.

----------


## bbclone

>J'en avais marre non pas en tant qu'utilisateur de Synth, mais en tant que dveloppeur de Synth, c'est diffrent ;-)

moi j'aimerai bien apprendre Synth mais j'ai jamais trouver de bonne documentation. avec que la javadoc c'est un peu trop peu. 
la documentation est prevue pour?
et un l&f completement baser sur synth prevus pour?


>Le plus simple est d'tendre une des classes *UI. Par exemple pour un bouton, BasicButtonUI ou MetalButtonUI. Ensuite il faudra faire monBouton.setUI(MaButtonUI.getUI()). Il y a tout un tas de dtails mais c'est en gros la solution la plus rutilisable.

moi depuis que je fais du swing (environ 6 mois) chaque fois qu'un truc me plais pas dans un composant swing, je fais des chose comme sa; j'extend le Basic*UI et redessine comme je veux ou alors j'extend de JComponent et crer aussi un UI delegate pour ce nouveau composant... 
ca marche bien. 
il y a quelque jour sur ce forom quelqu'un demandait comment on peux changer l'apparence des tooltip. j'ai fais de cette facon.
premiere remarque "combien de code pour si peu" c'est vrai c'est un peu de code il avait raison 

maintenant qu'est ce que j'ai compris de Synth c'est que ca permettrait de faire beaucoup de chose sur le look des composant rien qu'en passant par des fichier xml. j'ai essayer une fois de changer le design d'un JTextField grace a Synth j'avais un fichier xml enorme et j'avais pas encore le resultat que je voulait. 
J'aurais extend un BasicTextFieldUI ou meme TextUI j'aurais fais le truc beaucoup plus vite grace a des effets java2d.

en plus d'apres que ce que j'ai lu (je lit beaucoup  ::lol::  ) les performance des application swing sont diminuer a cause de synth. si ceux qui discute de swing (alors qui connaisse pas swing) la http://www.developpez.net/forums/showthread.php?t=861 voit que synth ralenti les application swing immagine alors la reputation de swing qui pour eux est deja lent??? 
c'est normal je supose que c'est plus lent a cause du parsing xml?


alors quel est le vrai apport de Synth et pourquoi aucun l&f complet en synth est fourni comme exemple de chez sun?pourquoi y'a pas de documentation?

----------


## Gfx

> moi j'aimerai bien apprendre Synth mais j'ai jamais trouver de bonne documentation. avec que la javadoc c'est un peu trop peu. 
> la documentation est prevue pour?


Il y a une documentation dont les liens se trouvent dans la javadoc. Je ne parle pas des javadoc des classes mais des documentations supplmentaires. Il y aussi des tutoriaux de Scott Violet et d'IBM sur Synth.




> et un l&f completement baser sur synth prevus pour?


Rien d'officiel n'est prvu.




> maintenant qu'est ce que j'ai compris de Synth c'est que ca permettrait de faire beaucoup de chose sur le look des composant rien qu'en passant par des fichier xml. j'ai essayer une fois de changer le design d'un JTextField grace a Synth j'avais un fichier xml enorme et j'avais pas encore le resultat que je voulait.


Modifier un JTextField ne demande que quelques lignes de XML avec Synth.




> en plus d'apres que ce que j'ai lu (je lit beaucoup  ) les performance des application swing sont diminuer a cause de synth.


Je n'ai jamais constat cela. Le lancement peut tre plus lent  cause du parsing XML mais pour le reste... Synth utilise des images. Afficher une image est bien plus rapide que de dessiner des dgrads ou afficher certaines formes avec Java2D. Depuis Java 1.5 ces images peuvent en outre tre acclres (astuce : utilisez des PNG en 32 bits).




> alors quel est le vrai apport de Synth et pourquoi aucun l&f complet en synth est fourni comme exemple de chez sun?pourquoi y'a pas de documentation?


Un bon look and feel crit en Java ncessite des mois de travail. Un book look crit avec Synth ncessite quelques semaines. Il n'y aucun look Synth fournit par Sun car l'quipe Swing est dborde et qu'il est en outre difficile d'obtenir un designer graphique.

----------


## bbclone

salut gfx, 



je lis ton blog de temp en temp autre et j'aime bien les trucs que tu met sur swing.

tu sais pas mais je suis que etudiant et j'ai pas une tres grande experience de Swing. 

j'utilise swing que depuis environ 6 mois. j'ai fait un stage ou j'ai utiliser swing et j'ai du faire une petite application pour l'ecole. 





>Il y a une documentation dont les liens se trouvent dans la javadoc. Il y aussi des tutoriaux de Scott Violet et d'IBM sur Synth.



quand j'ai essayer de voir sur Synth, j'ai trouver aussi ces deux liens

http://javadesktop.org/articles/synth/index.html

http://www-128.ibm.com/developerwork...brary/j-synth/



mais c'est pas possible de presenter synth en deux pages? les deux pages sont tres simples. je crois pas que synth se limite a qu'est ce qu'il y a dans ces deux page et c'est tout. 



> Modifier un JTextField ne demande que quelques lignes de XML avec Synth. 

ok alors alons y :-)


un tout bete exemple j'arrive pas a le faire fonctionner comme je veut.

j'ai un textfield avec une couleur de BACKGROUND et une couleur de TEXT_FOREGROUND

je veux que quand le textfield a le focus ces 2 couleur change

voila comment je fait

mon premier fichier :MyFrame.java


```

```

mon deuxieme fichier: mySynth.xml


```

```

mon troisieme fichier: MyPainter.java


```

```

ce bete truc fais deja pas qu'est ce que je veux. la couleur du texte est toujours en blanc mais le BACKGROUND change.
alors ca sert a rien d'essayer de changer (DISABLED, MOUSE_OVER...)les autre etat si deja ca ca marche pas. 


> Synth utilise des images.
Comment ca? Synth utilise toujour de image ou seulement quand on utilise des imagePainter? j'ai pas compri qu'est ce que tu veut dire.


je me demandait aussi comment on peut par exemple definir plusieur style sur des composants? 
par exemple j'ai deux type de textField dans une application. j'ai par exemple des textField pour saisir des parametre de recherche et des autres textField pour l'affichage pour des autre champ. Je veux que tout les critere dans toute l'application soit d'une certaine facon, et tout les autre d'une autre facon? Dans Synth par Component tu peut definir un style par etat pour ce composant. Alors comment je peux faire si je veux plusieurs style?

> Un book look crit avec Synth ncessite quelques semaines
je voit bien que ce sera plus rapide que d'ecrire tout un look un feel mais je crois toujour que la solution la plus rapide et plus efficace est d'extend des ComponentUI et de les painter comme on veut puis tu fais des setUI sur tes JComponent. 


je suis toujours pas convaicu de Synth.
et pour la documentation, compare un peu Microsoft avec son .Net et Sun avec Java. une documentation sur synth serait vraiment la bienvenue :-)
y'a pas que Synth qui est mal documenter en java mais c'est un aute sujet ca :-)

----------


## Gfx

Je n'ai pas dit que la documentation tait parfaite ni mme excellente, j'ai dit qu'il y en avait et qu'elle m'avait suffit  faire des petits thmes avec Synth.

Tu peux crer plusieurs thmes pour un seul composant, il suffit de ne pas utiliser <bind style="textfield" type="region" key="TextField"/> mais <bind style="textfield" type="region" name="SearchField"/> et de faire un setName("SearchField") tu ton composant.

J'utilise Swing depuis sa version 0.7, avant que cela ne soit intgr au JDK. J'ai crit *beaucoup* de code Swing et j'ai tendu *beaucoup* de composants. Je maintiens que Synth permet de travailler beaucoup plus vite, notamment quand, comme moi, tu fais d'abord ton design dans un outil comme Photoshop. Il suffit d'extraire les images et des les rutiliser avec les <imagePainter />.

P.S : Je suis galement tudiant  ::):

----------


## bbclone

> j'ai dit qu'il y en avait et qu'elle m'avait suffit  faire des petits thmes avec Synth.

ouaip j'y arrive aussi. 
mais y'a parfoit des truc que je me demande vraiment pourquoi ca marche pas. 
comme l'exemple que j'ai mi la. pourtant c'est con comme truc. tu trouve pas?

> P.S : Je suis galement tudiant
je sais, ton blog est dans planetjdk que je lit assez souvent ;-)

----------


## Gfx

Essaye <state value="SELECTED and FOCUSED">

----------


## bbclone

ben ca peut pas marcher  ::?:  
quand le state est SELECTED je veut une couleur 
et quand c'est FOCUSED je veut une autre couleur. 

si je mets SELECTED and FOCUSED j'aurai toujour les meme couleur dans les deux cas?

----------


## bbclone

j'ai quand meme essayer, ca marche pas  ::lol::

----------

