Java 1.4.2 introduit une apparence (look-and-feel) basée sur GTK+ 2.0. Cette apparence doit être requise explicitement, soit en faisant appel à UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel") dans votre code, soit en définissant la propriété système swing.defaultlaf et en lui donnant la valeur com.sun.java.swing.plaf.gtk.GTKLookAndFeel.
L'apparence GTK+ peut être personnalisée avec les fichiers de resources standard de GTK+ 2.0. Swing utilise l'algorithme suivant pour récolter les resources :
1. Si la propriété système swing.gtkthemefile existe, il lit le fichier correspondant et puis s'arrête. Par exemple, pour lancer la démo Swing avec un thème personnel stocké dans le fichier monTheme situé dans le répertoire personnel de l'utilisateur: java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel -Dswing.gtkthemefile=/home/moi/monTheme -jar SwingSet2.jar
2. S'il y a un fichier .gtkrc-2.0 dans le répertoire personnel de l'utilisateur, il le lit (mais ne s'arrête pas là).
3. Il détermine le nom du thème choisi par l'utilisateur (par exemple, NomDuTheme) en lisant la propriété de bureau gnome.net/ThemeName (voir le standard XSETTINGS pour plus d'informations sur la manière de lire et d'écrire les propriétés de bureau). Si cette propriété n'existe pas ou est vide, il utilise "Default" comme nom de thème. Une fois que le nom du du thème est déterminé :
3.1 S'il y a un fichier .themes/NomDuTheme/gtk-2.0/gtkrc dans le répertoire personnel de l'utilisateur, il le lit et puis s'arrête.
3.2 Si la propriété système swing.gtkthemedir existe, et que le fichier swing.gtkthemedir/NomDuTheme/gtk-2.0/gtkrc existe, il le lit et puis s'arrête.
3.3 Si la propriété système swing.gtkthemedir n'existe pas, et que le fichier /usr/share/themes/NomDuTheme/gtk-2.0/gtkrc existe, il le lit et puis s'arrête.
3.4 Si la propriété système swing.gtkthemedir existe, et que le fichier swing.gtkthemedir/NomDuTheme/gtk/gtkrc existe, il le lit et puis s'arrête.
3.5 Si la propriété système swing.gtkthemedir n'existe pas, et que le fichier /usr/share/themes/NomDuTheme/gtk/gtkrc existe, il le lit et puis s'arrête.
(Et je suppose que si aucun de ces fichiers n'existe, c'est la merde.)
GTK+ peut être personnalisé au moyen de moteurs de thèmes. Une poignée de tels moteurs existe. Dans Java 1.4.2, Swing supporte les fichiers de thème pour les moteurs Default, pixmap et bluecurve. L'équipe est en train de réfléchir à la création d'une API pour permettre l'ajout d'autres moteurs de thèmes. (Ce qui ne veut en aucun cas dire qu'elle verra le jour.)
GTK+ permet de spécifier les polices de caractères de deux manières : en utilisant une XLFD et en utilisant une chaîne Pango. Pango offre des fonctionnalités similaires aux "polices composites" de Java. Toutefois, comme les fontes composites Pango ne correspondent pas totalement aux fontes composites Java, il se peut qu'une application Swing sous apparence GTK+ présente quelques différences avec les applications GTK+ natives. (Pas très clair, tout ça. J'ai le sentiment que ça concerne surtout les langages non-Européens.) L'équipe est en train de réfléchir à la résolution de ce problème. (Aucune promesse, bien sûr.) En attendant, il devrait être possible de remplacer le fichier de polices de Pango par un fichier équivalent au fichier font.properties de Java. (Pas clair, pas clair.) De plus, dans la version 1.4.2, les XLFD sont ignorées et les chaînes Pango sont directement passées à java.awt.Font, après avoir remplacé "sans" par "sansserif" et "monospace" par "monospaced".
GTK+ n'offre pas de capacités MDI (JInternalFrame) et ne permet pas d'appliquer de thème à la fenêtre racine de l'application, tâches déléguées au gestionnaire de fenêtres. Les classes MDI de Swing peuvent être thèmées (blèh) par l'intermédiaire de Metacity. Seuls les thèmes Crux et Bluecurve sont supportés actuellement. Si aucun de ces deux thèmes ne peut être localisé, Swing utilise son thème interne. La propriété système swing.metacitythemename peut être utilisée pour indiquer quel thème utiliser (Crux ou Bluecurve, donc), en son absence le fichier .gconf/apps/metacity/general/%gconf.xml dans le répertoire personnel de l'utilisateur est consulté pour déterminer le nom du thème à utiliser. Swing tente ensuite de lire les fichiers de resources /usr/share/themes/NomDuTheme/metacity-1/metacity-theme-1.xml et /usr/gnome/share/themes/NomDuTheme/metacity-1/metacity-theme-1.xml pour charger le thème lui-même.
Les fichiers de resources GTK+ permettent de personnaliser plus que l'apparence. Java 1.4.2 supporte les "primary style configurations" (gni ?) (par exemple fg, bg, base, etc.), et également gtk-font-name, gtk-icon-sizes, stock icons (pour l'optionpane), focus-line-width, focus-padding, focus-line-pattern, internal-padding, shadow-type (pour les menubars) et trough-border.
GTK+ offre un mécanisme par lequel les applications peuvent changer de thème et mettre à jour leur interface dynamiquement. Ce mécanisme sera supporté dans une version ultérieure de l'apparence GTK+ de Swing.
Incompatibilités GTK+
Bon, si vous êtes programmeur, vous irez lire la VO. En gros, l'intégration de l'apparence GTK+ dans Swing a été un vrai défi, au vu des différences d'architecture. Les applications qui font appel à setOpaque(), ou qui installent des Borders sur des widgets peuvent avoir des surprises au niveau du graphisme. L'équipe travaille bien évidemment sur le problème.
[^] # Support de GTK+ dans Java 1.4.2
Posté par Boa Treize (site web personnel) . En réponse à la dépêche Java 1.4.2 disponible. Évalué à 10.
Java 1.4.2 introduit une apparence (look-and-feel) basée sur GTK+ 2.0. Cette apparence doit être requise explicitement, soit en faisant appel à UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel") dans votre code, soit en définissant la propriété système swing.defaultlaf et en lui donnant la valeur com.sun.java.swing.plaf.gtk.GTKLookAndFeel.
L'apparence GTK+ peut être personnalisée avec les fichiers de resources standard de GTK+ 2.0. Swing utilise l'algorithme suivant pour récolter les resources :
1. Si la propriété système swing.gtkthemefile existe, il lit le fichier correspondant et puis s'arrête. Par exemple, pour lancer la démo Swing avec un thème personnel stocké dans le fichier monTheme situé dans le répertoire personnel de l'utilisateur: java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel -Dswing.gtkthemefile=/home/moi/monTheme -jar SwingSet2.jar
2. S'il y a un fichier .gtkrc-2.0 dans le répertoire personnel de l'utilisateur, il le lit (mais ne s'arrête pas là).
3. Il détermine le nom du thème choisi par l'utilisateur (par exemple, NomDuTheme) en lisant la propriété de bureau gnome.net/ThemeName (voir le standard XSETTINGS pour plus d'informations sur la manière de lire et d'écrire les propriétés de bureau). Si cette propriété n'existe pas ou est vide, il utilise "Default" comme nom de thème. Une fois que le nom du du thème est déterminé :
3.1 S'il y a un fichier .themes/NomDuTheme/gtk-2.0/gtkrc dans le répertoire personnel de l'utilisateur, il le lit et puis s'arrête.
3.2 Si la propriété système swing.gtkthemedir existe, et que le fichier swing.gtkthemedir/NomDuTheme/gtk-2.0/gtkrc existe, il le lit et puis s'arrête.
3.3 Si la propriété système swing.gtkthemedir n'existe pas, et que le fichier /usr/share/themes/NomDuTheme/gtk-2.0/gtkrc existe, il le lit et puis s'arrête.
3.4 Si la propriété système swing.gtkthemedir existe, et que le fichier swing.gtkthemedir/NomDuTheme/gtk/gtkrc existe, il le lit et puis s'arrête.
3.5 Si la propriété système swing.gtkthemedir n'existe pas, et que le fichier /usr/share/themes/NomDuTheme/gtk/gtkrc existe, il le lit et puis s'arrête.
(Et je suppose que si aucun de ces fichiers n'existe, c'est la merde.)
GTK+ peut être personnalisé au moyen de moteurs de thèmes. Une poignée de tels moteurs existe. Dans Java 1.4.2, Swing supporte les fichiers de thème pour les moteurs Default, pixmap et bluecurve. L'équipe est en train de réfléchir à la création d'une API pour permettre l'ajout d'autres moteurs de thèmes. (Ce qui ne veut en aucun cas dire qu'elle verra le jour.)
GTK+ permet de spécifier les polices de caractères de deux manières : en utilisant une XLFD et en utilisant une chaîne Pango. Pango offre des fonctionnalités similaires aux "polices composites" de Java. Toutefois, comme les fontes composites Pango ne correspondent pas totalement aux fontes composites Java, il se peut qu'une application Swing sous apparence GTK+ présente quelques différences avec les applications GTK+ natives. (Pas très clair, tout ça. J'ai le sentiment que ça concerne surtout les langages non-Européens.) L'équipe est en train de réfléchir à la résolution de ce problème. (Aucune promesse, bien sûr.) En attendant, il devrait être possible de remplacer le fichier de polices de Pango par un fichier équivalent au fichier font.properties de Java. (Pas clair, pas clair.) De plus, dans la version 1.4.2, les XLFD sont ignorées et les chaînes Pango sont directement passées à java.awt.Font, après avoir remplacé "sans" par "sansserif" et "monospace" par "monospaced".
GTK+ n'offre pas de capacités MDI (JInternalFrame) et ne permet pas d'appliquer de thème à la fenêtre racine de l'application, tâches déléguées au gestionnaire de fenêtres. Les classes MDI de Swing peuvent être thèmées (blèh) par l'intermédiaire de Metacity. Seuls les thèmes Crux et Bluecurve sont supportés actuellement. Si aucun de ces deux thèmes ne peut être localisé, Swing utilise son thème interne. La propriété système swing.metacitythemename peut être utilisée pour indiquer quel thème utiliser (Crux ou Bluecurve, donc), en son absence le fichier .gconf/apps/metacity/general/%gconf.xml dans le répertoire personnel de l'utilisateur est consulté pour déterminer le nom du thème à utiliser. Swing tente ensuite de lire les fichiers de resources /usr/share/themes/NomDuTheme/metacity-1/metacity-theme-1.xml et /usr/gnome/share/themes/NomDuTheme/metacity-1/metacity-theme-1.xml pour charger le thème lui-même.
Les fichiers de resources GTK+ permettent de personnaliser plus que l'apparence. Java 1.4.2 supporte les "primary style configurations" (gni ?) (par exemple fg, bg, base, etc.), et également gtk-font-name, gtk-icon-sizes, stock icons (pour l'optionpane), focus-line-width, focus-padding, focus-line-pattern, internal-padding, shadow-type (pour les menubars) et trough-border.
GTK+ offre un mécanisme par lequel les applications peuvent changer de thème et mettre à jour leur interface dynamiquement. Ce mécanisme sera supporté dans une version ultérieure de l'apparence GTK+ de Swing.
Incompatibilités GTK+
Bon, si vous êtes programmeur, vous irez lire la VO. En gros, l'intégration de l'apparence GTK+ dans Swing a été un vrai défi, au vu des différences d'architecture. Les applications qui font appel à setOpaque(), ou qui installent des Borders sur des widgets peuvent avoir des surprises au niveau du graphisme. L'équipe travaille bien évidemment sur le problème.