Test graphique des fontes disponibles dans swing avec jython

03/09/2003

L’utilisation de Jython pour tester Java est vraiment fort agréable. La syntaxe simplifiée de Jython permet de tester rapidement le jdk pour confirmer ou infirmer des suppositions quant à son fonctionnement.

Lister les fontes disponibles

Ici, j’avais besoin de connaître les fontes disponibles, et plutôt que de se lancer dans un programme Java me donnant l’information, les quelques lignes suivantes répondirent rapidement à mon besoin :

from java.awt import *

ge = GraphicsEnvironment.getLocalGraphicsEnvironment()
for font in ge.getAllFonts():
    print font.getFontName()

Quatre lignes suffisent donc ! Le résultat est le suivant :

Arial
Arial Black
Arial Italique
Arial Gras
Arial Gras Italique
Comic Sans MS
Comic Sans MS Gras
Courier New
Courier New Italique
Courier New Gras
...

Test graphique des fontes

Avoir le nom de ces fontes en très peu de temps est déjà appréciable, mais compléter ce bout de programme pour avoir un rendu graphique, est encore mieux. Ainsi, il est beaucoup plus facile, de sélectionner la fonte désirée.

from java.lang import *
from java.awt import *
from javax.swing import *

testtext = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890"
def windowClosingEvt(evt): System.exit(0)

# class enable to change the font of each label contained in the list
class FontRenderer(DefaultListCellRenderer):
    def getListCellRendererComponent(self, list_,value,index,isSelected,hasFocus):
        label = DefaultListCellRenderer.getListCellRendererComponent(self,list_,
            value,index,isSelected,hasFocus)
        label.setFont(Font(str(value), Font.PLAIN, 14))
        label.setText("%s : %s"%(str(value),testtext))
        return label

# create the main frame
fr = JFrame("Font tests", size=(400,400), windowClosing=windowClosingEvt)

# create the font list
ge = GraphicsEnvironment.getLocalGraphicsEnvironment()
fontlist = map(lambda x:x.getFontName() , ge.getAllFonts())
j = JList(fontlist, cellRenderer = FontRenderer() )

#add the list to the frame and show it
fr.getContentPane().add(JScrollPane(j))
fr.visible=1

Le programme ci-dessus crée une liste (JList) et insére tous les noms des polices disponibles. Chaque ligne est bien sûr formattée à l’aide de sa propre fonte, ce qui permet d’avoir le rendu en même temps que le nom. Rien de spécial à ce code, mis à part un aspect intéressant de l’utilisation de la syntaxe Python : la manipulation des listes. Et plus particulièrement, celle de la fonction map. Ainsi

fontlist = map(lambda x:x.getFontName() , ge.getAllFonts())

permet d’appliquer une lambda expression (chargée de trouver le nom de la fonte) à chaque élément de la liste. Ce concept évite donc l’écriture d’une boucle sur chacun des éléments.

Le résultat de cette expression est une liste qui contient chaque élément transformé.

Test graphique des fontes Java

Le fichier de test fonts.py