2010-11-05 18 views
1

J'ai une application où j'ai besoin de changer la taille des polices fréquemment. Une question postée il y a un an sur ce forum (Change just the font size in SWT) m'a donné certaines des informations dont j'avais besoin, mais j'ai encore quelques inconnues que je n'ai pas encore comprises.Comment puis-je changer d'écouteur en toute sécurité?

En particulier, une personne comme la signature hudsonb offert un fragment de code utile que je voudrais reproduire ci-dessous:

FontData[] fontData = label.getFont().getFontData(); 
for(int i = 0; i < fontData.length; ++i) 
    fontData[i].setHeight(14); 

final Font newFont = new Font(display, fontData); 
label.setFont(newFont); 

// Since you created the font, you must dispose it 
label.addDisposeListener(new DisposeListener() { 
    public void widgetDisposed(DisposeEvent e) { 
     newFont.dispose(image); 
    } 
}); 

Supposons je code comme ceci pour changer la taille des caractères fréquemment. N'ai-je pas créé une séquence entière de DisposeListeners et les ai-je ajoutés à la file d'écoute du label? N'ai-je pas besoin de supprimer l'écouteur précédent chaque fois avant d'ajouter un nouvel écouteur? Ou y a-t-il un mécanisme que je ne comprends pas qui rend cela inutile?

+0

Ajout de la balise 'java'. –

Répondre

0

Une alternative serait d'ajouter un DisposeListener qui maintient une liste des polices dont il a besoin de disposer d'une fois terminé avec, par exemple

class FontDisposer implements DisposeListener { 
    private List<Font> toDispose; 

    public FontDisposer() { 
     toDispose = new ArrayList<Font>(); 
    } 

    @Override 
    public void widgetDisposed(DisposeEvent e) { 
      // Dispose all fonts in toDispose 
    } 

    public void registerFont(Font f) { 
     toDispose.add(f); 
    } 
} 

class UIWotsit extends SomeUIClass { 
    private FontDisposer disposer; 

    public UIWotsit() { 
     disposer = new FontDisposer(); 
     addDisposeListener(disposer); 
    } 

    public void changeFont(Font f) { 
     disposer.registerFont(f); 
     // Do all the font changing stuff 
    } 
} 

Ceci peut ne pas convenir à votre application particulière mais avoir quelque chose qui maintient une liste de polices est probablement un début raisonnable. Vous pouvez également utiliser un DisposeListener anonyme qui appelle une méthode quel que soit le code gère la création de la police/modification/élimination:

class OtherFontDisposer implements DisposeListener { 
    @Override 
    public void widgetDisposed(DisposeEvent e) { 
     myCleverFontManager.disposeOfAll(); 
    } 
} 

Tout dépend si vous créez de nouvelles étiquettes ou non, et si vous voulez disposer Polices immédiatement ou uniquement lorsque l'interface utilisateur est éliminée.

+0

Ah, c'est très intelligent. Beaucoup moins de travail que ce à quoi je pensais. –

+0

N'hésitez pas à le marquer comme la réponse sélectionnée alors :) –

+0

Nice. Pourquoi s'embêter à initialiser 'toDispose' dans la pensée du constructeur, au lieu de' private List toDispose = new ArrayList (); '? –

0

Vous devriez probablement supprimer les anciens écouteurs. Pour ce faire, avec:

private DisposeListener listener = null; 
//... 
if (listener != null) 
    label.removeDisposeListener(listener); 
listener = new DisposeListener() { 
    public void widgetDisposed(DisposeEvent e) { 
     newFont.dispose(image); 
    } 
} 
label.addDisposeListener(listener); 
+0

Oui, c'est ce que je me demandais si j'avais besoin de le faire. Puisque le nouvel écouteur est créé à un endroit et à une heure éloignés dans le code, pour ce faire, je devrais conserver un handle à l'écouteur précédent de sorte qu'il puisse être disponible au point d'élimination. Je peux le faire, mais c'est beaucoup de travail, et j'essaie de savoir si c'est nécessaire. Votre vote est: probablement oui? –

+0

Ouais. J'essayais de trouver un meilleur moyen de le contourner, mais cela semble être le plus simple. –

0

Si vous changez souvent la taille de votre police, vous devrez probablement revenir aux tailles que vous avez déjà utilisées. Vous pouvez donc mettre en cache vos instances Font. Pour ce faire, vous pouvez utiliser le FontRegistry de JFace (JavaDoc) au lieu d'une liste. Vous n'aurez pas besoin de disposer du Fonts, car cela est effectué par le registre lorsque votre Display est éliminé.

Vous devez toujours mettre votre FontData dans le registre s'il ne contient pas la taille dont vous avez besoin pour le moment.

+0

Cool - Je ne connaissais pas le FontRegistry. Merci! –