2010-06-07 3 views
6

J'essaie de créer un panneau Swing dont les éléments ont une taille de police différente de celle du reste de l'application swing. Initialement, l'utilisation de setFont pour quelques composants n'a posé aucun problème. Maintenant, j'ai plusieurs composants (et tous leurs sous-composants), donc cette solution est impraticable.Modifier la taille de la police d'un JPanel et tous ses éléments

J'ai cherché à changer les propriétés d'interface utilisateur par défaut des composants de swing. Ce que j'ai trouvé est principalement en utilisant UIManager, qui change les propriétés globalement. Cela ne fonctionne pas pour moi parce que je veux garder les paramètres de police actuels pour tous les autres panneaux.

Pour le moment (et que je n'aime pas poster sans essayer quelque chose d'abord), j'ai un algorithme comme celui-ci:

public static void fixFont(Container c) { 
    c.setFont(c.getFont().deriveFont(10.0f)); 
    Component[] comp = c.getComponents(); 
    for (int i=0;i<comp.length;++i) { 
     if (comp[i] instanceof Container) { 
      fixFont((Container) comp[i]); 
     } else { 
      comp[i].setFont(comp[i].getFont().deriveFont(10.0f)); 
     } 
    } 
} 

Le problème est que:

  • il N'inclut pas certains éléments swing comme sa bordure.
  • Je dois appeler cette fonction lorsque j'ajouter d'autres composants dynamiquement

Question: Y at-il une autre façon de modifier les propriétés de police d'un groupe Swing et tous ses composants, éléments, etc. (c.-à-tout le panel) ?

Merci pour vos idées

Répondre

4

Vous pouvez utiliser cette astuce:

import java.awt.*; 

public class FrameTest { 

    public static void setUIFont(FontUIResource f) { 
     Enumeration keys = UIManager.getDefaults().keys(); 
     while (keys.hasMoreElements()) { 
      Object key = keys.nextElement(); 
      Object value = UIManager.get(key); 
      if (value instanceof FontUIResource) { 
       FontUIResource orig = (FontUIResource) value; 
       Font font = new Font(f.getFontName(), orig.getStyle(), f.getSize()); 
       UIManager.put(key, new FontUIResource(font)); 
      } 
     } 
    } 

    public static void main(String[] args) throws InterruptedException { 

     setUIFont(new FontUIResource(new Font("Arial", 0, 20))); 

     JFrame f = new JFrame("Demo"); 
     f.getContentPane().setLayout(new BorderLayout()); 

     JPanel p = new JPanel(); 
     p.add(new JLabel("hello")); 
     p.setBorder(BorderFactory.createTitledBorder("Test Title")); 

     f.add(p); 

     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(300, 300); 
     f.setVisible(true); 
    } 
} 

Produit:

enter image description here

+0

Je ne souhaite modifier que les polices du panneau et tous ses éléments. Je ne veux pas changer la police des autres panneaux. Faire cela en utilisant UIManager change la police pour tous les composants Swing. – YuppieNetworking

+0

Ah, bon point. Je n'ai pas réalisé ce dont tu avais vraiment besoin. Je ne sais pas comment (ou si c'est possible) de le résoudre maintenant que je comprends votre question. – aioobe

+1

Une solution de "sauvegarde" serait de faire comme vous le faites maintenant, mais également de vérifier et de mettre à jour les frontières via 'getBorder' et' instanceof TitledBorder'/'TitledBorder.setTitleFont' etc – aioobe

1

vous pouvez remplacer la méthode add sur votre composant de base et appliquer la police aux composants ajoutés et leurs enfants là-bas. cela vous éviterait d'appliquer la police manuellement lorsque les composants sont ajoutés plus tard.

+0

Toujours pas de travail pour les bordures etc ... – aioobe

+0

Cela ne fonctionnera pas pour tous les éléments du panneau. Par exemple: un JPanel qui a un JPanel avec un label. – YuppieNetworking

+0

peut ne pas fonctionner pour les bordures, mais vous pouvez mettre n'importe quel code dans votre implémentation 'add', donc il n'y a aucune raison de ne pas pouvoir appeler quelque chose comme le code dans votre question. Fondamentalement, je ne pense pas qu'il y ait une réponse facile à cela. c'est une opération "désordonnée". – pstanton

Questions connexes