2010-03-12 8 views
1

Je suis en train de mettre à jour une application Java Swing pour supporter que l'utilisateur passe de la taille normale à la taille normale (pour que l'utilisateur puisse basculer entre les deux tailles à l'exécution). Un problème que j'ai est avec un JTree qui utilise le HTML pour les nœuds de l'arbre pour souligner le texte dans certains nœuds (le HTML est simplement intégré dans le JLabel de chaque nœud d'arbre). Une chose supplémentaire à savoir sur les nœuds est qu'ils sont un composant personnalisé, en ajoutant un JCheckBox devant chaque JLabel. Le problème est qu'une fois le JTree visible, l'augmentation de la taille de la police entraîne la non-redimensionnement des nœuds (contenant du texte souligné). Le code HTML pour ces noeuds semble empêcher le noeud de devenir plus large, donc quand la police change, le texte devient tronqué. Je pense que mes options sont de: 1) utiliser une autre approche pour faire le texte souligné, puisque la suppression du HTML du JLabel le fait redimensionner correctement lorsque la taille de la police change, ou 2) conserver le format HTML et en quelque sorte forcer le JTree/JLabels à redimensionner lorsque la taille de la police est mise à jour (éventuellement en tirant un événement de changement de propriété?).Comment forcer un JLabel HTML dans un JTree à redimensionner quand la police change

Le code appelle déjà SwingUtilities.updateComponentTreeUI() sur le JFrame parent lorsque la taille de la police est mise à jour.

EDIT: La méthode utilisée pour changer la police dans l'application est explained here.

Toute aide serait grandement appréciée. Merci d'avance!

-Mike

+0

La grande question ici est: comment changer la taille de la police dans votre application? Sans réponse à cette question, nous ne serons d'aucune aide. – Riduidel

+0

Merci pour le commentaire. J'ai modifié la question pour inclure un lien vers un post SO précédent qui explique comment la police est modifiée. – Mike

Répondre

2

Je ne peux pas recréer le problème que vous décrivez. Voici un programme de test qui fonctionne pour moi sur JavaSE 6:

public class JTreeFontResize { 
    private static JTree tree; 
    private static JFrame frame; 

    public static void main(String[] args) throws InterruptedException, 
      InvocationTargetException { 
     SwingUtilities.invokeAndWait(new Runnable() { 
      @Override 
      public void run() { 
       tree = new JTree(new Object[] { "One (plain)", 
         "<html><u>Two (HTML)", "<html>Three (HTML)" }); 
       frame = new JFrame("Tree Font Resize"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setBounds(100, 100, 300, 300); 
       frame.add(tree); 
       frame.setVisible(true); 
      } 
     }); 

     Thread.sleep(2000); 
     changeFontSize(20); 

     Thread.sleep(2000); 
     changeFontSize(30); 

     Thread.sleep(2000); 
     changeFontSize(12); 
    } 

    private static void changeFontSize(final int size) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Font font = new Font("Vernanda", Font.PLAIN, size); 
       FontUIResource fontResource = new FontUIResource(font); 
       Enumeration<Object> keys = UIManager.getDefaults().keys(); 
       while (keys.hasMoreElements()) { 
        Object key = keys.nextElement(); 
        Object value = UIManager.get(key); 
        if (value instanceof FontUIResource) { 
         UIManager.put(key, fontResource); 
        } 
       } 
       SwingUtilities.updateComponentTreeUI(frame); 
      } 
     }); 
    } 
} 

Si les travaux ci-dessus pour vous alors peut-être vous devriez poster une version réduite de votre code problématique.

+0

C'est la bonne réponse. Après quelques tests supplémentaires basés sur ce qui précède, le problème réside dans le composant personnalisé utilisé pour ajouter une case à cocher à chaque nœud d'arbre. Merci pour l'aide! – Mike