Bonjour,
Comment peut on changer la fonte pour tout une application ? (sans passer par la méthode setFont des JComponent)
Si quelqu'un connait un bon tutoriel traitant de la création d'un L&F je suis preneur !
Merci d'avance.
Version imprimable
Bonjour,
Comment peut on changer la fonte pour tout une application ? (sans passer par la méthode setFont des JComponent)
Si quelqu'un connait un bon tutoriel traitant de la création d'un L&F je suis preneur !
Merci d'avance.
Bonjour,
Les paramètres par défaut d'un L&F sont définis séparément pour chaque composant.Il te faudra donc forcément énumérer tous les composants.
Sachant cela, tu as le choix de redéfinir un L&F ou de modifier celui en place en passant par UIDefaults.put(). Pour être sûr de n'oublier aucun composant, le mieux est de regarder le code source du L&F que tu modifies.
Exemple :[EDIT]J'ai posté un code faux !!!! Il faut remplacer UIDefaults.put(...) par UIManager.getDefaults().put(...)Code:
1
2
3
4
5
6 FontUIResource myFont = new FontUIResource("Dialog", Font.PLAIN, 12); UIDefaults.put("Label.font", myFont); UIDefaults.put("Panel.font", myFont); UIDefaults.put("Button.font", myFont); UIDefaults.put("RadioButton.font", myFont); ...
1 : les L&F
je te conseille la bibliothèque skinlf de lf2prod, dispo sur le site de javootoo.
tu peux utiliser ce code pour le mettre en place :
Son utilisation est un peu délicate, mais il existe 1 astuce infaillible ;). je te laisse chercher un peu, reviens nous voir si tu ne trouve pas.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public static void changeLF(JFrame param){ Skin skin = null; try { skin = SkinLookAndFeel.loadThemePack(SKIN_FILE_PATH); SkinLookAndFeel.setSkin(skin); // set the skin UIManager.setLookAndFeel("com.l2fprod.gui.plaf.skin.SkinLookAndFeel"); JFrame.setDefaultLookAndFeelDecorated(true); } catch (java.lang.Exception e) { e.printStackTrace(); } SwingUtilities.updateComponentTreeUI(param); //reSize de la fenêtre et centrage au mileu de l'écran. try{ param.pack(); int h = param.getHeight()+10; int w = param.getWidth()+10; param.setSize(w, h); java.awt.Dimension scrn = param.getToolkit().getScreenSize(); param.setLocation((int)(scrn.getWidth()-w)/2, (int)(scrn.getHeight()-h)/2); }catch(Exception e){} }
2 : la police.
Si tu cherche à changer ta fonte, je te conseille l'inox, C moins lourd ^^
Visiblement il n'y a pas d'autre solution que de changer les clés pour tous les composants. Pour ne pas en oublier j'ai fait le bout de code suivant :
Merci pour les réponses.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 FontUIResource bleriotFont = new FontUIResource("Bleriot", Font.PLAIN, 15); UIDefaults uiDefaults = UIManager.getDefaults(); Enumeration uiEn = uiDefaults.keys(); while (uiEn.hasMoreElements()) { Object key = uiEn.nextElement(); if (key.toString().endsWith(".font")) { uiDefaults.put(key, bleriotFont); } }
Juste pour info ..
Neptus quelle est ton astuce infaillible ??
il faut d'abord trouver l'erreur ...
ou disons tout du moins le problème d'affichage ...
après je vous dirait ^^
nan, je rigole ...
si vous faites :
la partie haute du skin (la barre de la JFrame) reste en style Windows.Code:
1
2
3
4 JFrame f = new JFrame(); //ajout des Component changeLF(f);
Pour y remédier, on fait (avec quelques variantes ...):
ne pas oublier les 2 appels au constructeur ...Code:
1
2
3
4
5 JFrame f = new JFrame(); changeLF(f); f = new JFrame(); //ajout des Component
De plus, on peut aussi utiliser cette méthode sur des JOptionPane malgré les différences d'héritage ... quelques autres astuces dans mon sac ;)
Cher Neptus,Citation:
ne pas oublier les 2 appels au constructeur ...
Si tu dois appeler un constructeur deux fois pour construire un seul objet, c'est certainement que quelque chose n'est pas bon dans ton code...
Il y a une astuce pour changer de LAF mais je te laisse chercher ;-)
il me semble qu'il faut faire appel à updateTreeUI() (ou un nom approchant) après le JFrame.setDefaultLookAndFeelDecorated(true); mais je ne suis pas sur de tout ça. Je n'ai pas de quoi tester aujourd'hui, je verrai ça ce soir, mais il me semble en effet qu'il existait une méthode moins barbare :) . Mais je ne me suis jamais donné la peine de chercher.
JFrame.setDefaultLookAndFeelDecorated(true); doit etre invoque avant de creer les fenetres. Sinon il faut en effet invoquer SwingUtilities.updateComponentTreeUI(leComposantRacine).
8O :bravo: :applo: J'y avais pas pensé !Citation:
Envoyé par Xavinou
C'est pas bête du tout.
Tu risques peut être d'avoir des surprises si la clé est du style "button.fontHighlight" ou consorts (je sais pas trop si il y en a).
Tu peux tester si la clé contient "font" (et non se termine par) ou si la valeur est instance de FontUIResource.