OVH Cloud OVH Cloud

L&F mac/windows

4 réponses
Avatar
Armel HERVE
Bonjour =E0 tous,

j'ai une classe qui =E9tend JComboBox pour faire apparaitre un popup=20
sp=E9cifique contenant diff=E9rents composants (comme un calendrier par=20
exemple).

Pour afficher le popup avec le bon L&F, j'ai le code suivant:

public void updateUI() {

ComboBoxUI ui =3D (ComboBoxUI)UIManager.getUI(this);

if(ui instanceof MetalComboBoxUI) {
ui =3D new MetalTypeComboBoxUI();
} else if(ui instanceof MotifComboBoxUI) {
ui =3D new MotifTypeComboBoxUI();
} else if(ui instanceof WindowsComboBoxUI) {
cui =3D new WindowsTypeComboBoxUI();
} else ...

setUI(ui);
}

avec une classe par L&F support=E9:
class MetalTypeComboBoxUI extends MetalComboBoxUI {

protected ComboPopup createPopup() {
return new TypePopup(comboBox);
}
}

Ma question est la suivante: je d=E9veloppe sous XP, comment puis-je=20
supporter le L&F du mac, sachant que les classes associ=E9es n'existe que=
=20
quand on est sur un mac ?

Merci d'avance

Armel, qui en a marre des probl=E8mes de compatibilit=E9s inter OS

4 réponses

Avatar
Cedric Lefebvre
Je ne comprends pas la necessite d'implementer updateUI dans ton composant.
Comme tu derives de JComboBox, par defaut, ton composant utilisera
l'UIComponent
utilise par JComboBox (MetalComboBoxUI par exemple).
Dans 99% des cas, tu dois pouvoir reutiliser les UIComponent existant (meme
pour
afficher des dates). Et si ce n'est pas le cas, c'est plus un probleme de
design que
d'implementation.
C'est en tous cas ce que je te conseillerai de faire.

Ensuite, pour repondre precisemment a ta question : ce n'est pas la bonne
maniere
de proceder que de faire des setUI dans l'updateUI.
Ce que tu veux faire consiste en fait a etendre les L&F existants... donc ne
bidouille
pas pour les etendre sans les etendre mais etend les reellement en
definissant
tes classes UIComponent dans la classe L&F. C'est la solution propre.

Cedric Lefebvre

"Armel HERVE" wrote in message
news:
Bonjour à tous,

j'ai une classe qui étend JComboBox pour faire apparaitre un popup
spécifique contenant différents composants (comme un calendrier par
exemple).

Pour afficher le popup avec le bon L&F, j'ai le code suivant:

public void updateUI() {

ComboBoxUI ui = (ComboBoxUI)UIManager.getUI(this);

if(ui instanceof MetalComboBoxUI) {
ui = new MetalTypeComboBoxUI();
} else if(ui instanceof MotifComboBoxUI) {
ui = new MotifTypeComboBoxUI();
} else if(ui instanceof WindowsComboBoxUI) {
cui = new WindowsTypeComboBoxUI();
} else ...

setUI(ui);
}

avec une classe par L&F supporté:
class MetalTypeComboBoxUI extends MetalComboBoxUI {

protected ComboPopup createPopup() {
return new TypePopup(comboBox);
}
}

Ma question est la suivante: je développe sous XP, comment puis-je
supporter le L&F du mac, sachant que les classes associées n'existe que
quand on est sur un mac ?

Merci d'avance

Armel, qui en a marre des problèmes de compatibilités inter OS
Avatar
Armel HERVE
In article <40f2e9d2$0$7726$,
says...
Je ne comprends pas la necessite d'implementer updateUI dans ton composan t.
Comme tu derives de JComboBox, par defaut, ton composant utilisera
l'UIComponent
utilise par JComboBox (MetalComboBoxUI par exemple).
Le problème est bien là: comment utiliser le L&F par défaut du syst ème ?


Dans 99% des cas, tu dois pouvoir reutiliser les UIComponent existant (me me
pour
afficher des dates). Et si ce n'est pas le cas, c'est plus un probleme de
design que
d'implementation.
C'est en tous cas ce que je te conseillerai de faire.
Je me suis mal exprimé: quand on clique sur la combo, son popup contient

un calendrier, ce qui n'est pas une liste, c'est pour cela que je
redéfinis la façon d'afficher le popup.

Ensuite, pour repondre precisemment a ta question : ce n'est pas la bonne
maniere
de proceder que de faire des setUI dans l'updateUI.
Ce que tu veux faire consiste en fait a etendre les L&F existants... donc ne
bidouille
pas pour les etendre sans les etendre mais etend les reellement en
definissant
tes classes UIComponent dans la classe L&F. C'est la solution propre.

Je ne demande que ça, mais comment faire pour l'environnement du Mac?


Cedric Lefebvre

"Armel HERVE" wrote in message
news:
Bonjour à tous,

j'ai une classe qui étend JComboBox pour faire apparaitre un popup
spécifique contenant différents composants (comme un calendrier par
exemple).

Pour afficher le popup avec le bon L&F, j'ai le code suivant:

public void updateUI() {

ComboBoxUI ui = (ComboBoxUI)UIManager.getUI(this);

if(ui instanceof MetalComboBoxUI) {
ui = new MetalTypeComboBoxUI();
} else if(ui instanceof MotifComboBoxUI) {
ui = new MotifTypeComboBoxUI();
} else if(ui instanceof WindowsComboBoxUI) {
cui = new WindowsTypeComboBoxUI();
} else ...

setUI(ui);
}

avec une classe par L&F supporté:
class MetalTypeComboBoxUI extends MetalComboBoxUI {



Avatar
Christophe M
Armel HERVE wrote:
In article <40f2e9d2$0$7726$,
says...

Je ne comprends pas la necessite d'implementer updateUI dans ton composant.
Comme tu derives de JComboBox, par defaut, ton composant utilisera
l'UIComponent
utilise par JComboBox (MetalComboBoxUI par exemple).


Le problème est bien là: comment utiliser le L&F par défaut du système ?


En début de programme tu fais :
try{

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch(Exception e){System.err.println("Look and feel pas chargé");}

Ensuite, dans toute l'application, TOUS les composants swings auront le
L&F de l'os de la machine ou ça tourne. Pas besoin de t'embéter à gérer
la bon look à chaque fois que t'as besoin d'une combobox.



Je ne demande que ça, mais comment faire pour l'environnement du Mac?



Sachant que le L&F mac est fourni par sun, si tu fais comme dit plus
haut t'auras pas de soucis. C'est ça aussi l'interet de Java, pas besoin
de se casser la tête sur les différents OS, c'est déjà géré pour toi.

Et de toute façon, si tu veux un L&F personnalisé, tu dois, comme déjà
expliqué, dériver d'un existant, le mieux étant le métal. Après ton L&F
sera disponible pour tous les OS. C'est comme ça qu'est fait le L&F mac
ou windows, mais comme y a une licence sur le look (et aussi dépendance
à des .dll natives) on ne peut simplement pas l'utiliser sur un autre OS.


Avatar
Cedric Lefebvre
Je me suis mal exprimé: quand on clique sur la combo, son popup contient
un calendrier, ce qui n'est pas une liste, c'est pour cela que je
redéfinis la façon d'afficher le popup.


Mais est-ce que tu as besoin de l'afficher le calendrier differemment selon
le L&F du systeme ? Ou bien est-ce que tu peux te contenter du L&F par
defaut des composants sous-jacents ?

Si c'est le 1/, tu ne peux pas, a moins de customiser toi meme les L&F et
donc
de livrer des L&F qui sont differents des L&F par defaut (vu que ce sont des
sous-classes).

Sinon, les reponses de Christophe M sont les bonnes.

Cedric Lefebvre