Nous avons une application Java qui utilisait Swing, mais nous sommes en train de la migrer vers JavaFX. Par conséquent, nous encapsulons l'ancien code Swing dans SwingNode
et les remplacer pas à pas.
Avant la migration, l'application Swing utilisait com.sun.java.swing.plaf.gtk.GTKLookAndFeel
comme look-and-feel (par défaut sur Ubuntu). Nous avons utilisé le code suivant pour le définir (si disponible) :
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if (info.getClassName().equals("com.sun.java.swing.plaf.gtk.GTKLookAndFeel")) {
UIManager.setLookAndFeel(info.getClassName());
}
}
Cela a bien fonctionné. Pourtant, après le passage à JavaFX, l'appel à UIManager.setLookAndFeel()
fige l'application, et rien ne se passe. Le paramétrage manuel de l'aspect et de la convivialité est nécessaire car nous souhaitons conserver le style des composants Swing qui n'ont pas été migrés vers JavaFX en fonction de l'aspect et de la convivialité de l'application. GTKLookAndFeel
.
Plus d'informations : Ceci ne fonctionne pas avec com.sun.java.swing.plaf.gtk.GTKLookAndFeel
puisqu'il fonctionne avec l'utilisation de javax.swing.plaf.metal.MetalLookAndFeel
, javax.swing.plaf.nimbus.NimbusLookAndFeel
ou com.sun.java.swing.plaf.motif.MotifLookAndFeel
.
Que pouvons-nous faire pour que cela fonctionne avec GTKLookAndFeel
pour donner du style à nos composants Swing dans l'environnement SwingNode
s ?
2 votes
Le faites-vous dans le bon fil ? Le code Swing doit être exécuté dans EventQueue.invokeLater .
0 votes
@VGR : Je ne le faisais pas avant, je l'ai changé maintenant, mais cela ne change toujours pas le comportement. L'application est toujours gelée.
2 votes
Essayez de l'exécuter en ligne de commande, et de vider toutes les piles de threads. Sous Windows, cela se fait avec Ctrl-Break ; sur d'autres systèmes, SIGQUIT le fera, accompli avec Ctrl-\ ou une commande séparée de
kill -3
commandement. Une des traces de la pile devrait indiquer où setLookAndFeel est bloqué.0 votes
VGR : Le fil de discussion qui s'occupe de la configuration de l'apparence et de la sensation semble être bloqué à
com.sun.java.swing.plaf.gtk.GTKEngine.native_get_gtk_setting(Native Method)
... J'ai testé cela avec un thread dump et le débogueur Eclipse.0 votes
Pouvez-vous fournir un échantillon minimal ? J'exécute ce snippet pastebin.com/wnLFqD6i sur Xfce avec la dernière GTK et Java 8 u121, il fonctionne bien. En regardant dans native_get_gtk_setting, il y a un bloc de synchronisation, ce qui semble suspect. Au fait, avez-vous essayé -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel ?
0 votes
@AndreLDM : Ok, votre exemple fonctionne également sur ma machine. Nous avons un
JTabbedPane
qui est défini comme le contenu d'un SwingNode dans le contrôleur de notre vue.initialize
et nous cherchons actuellement à savoir si cela a un rapport avec cette méthode. Il semble que l'appel du constructeur deJTabbedPane
suspend l'application. Je vais essayer de créer un exemple minimal.1 votes
Vous pouvez également fournir un vidage de fil avec
jstack -l
il vous montrera s'il y a une impasse. Vous avez mentionné que le fil était bloqué dansnative_get_gtk_setting
et que cette méthode est synchronisée, donc peut-être qu'un autre thread détient le verrou. Et cela pourrait arriver parce que Swing et JavaFX ont chacun leur propre thread...0 votes
La version installée de GTK est-elle >=2.2 ? Je sais que c'est une vieille question, mais je voulais juste savoir si vous aviez trouvé une solution à ce problème.
0 votes
@ChetanJadhavCD : J'ai à nouveau accès au PC demain, alors je peux vérifier. Je sais que l'OS est un défaut
Ubuntu 16.04 LTS
installer.0 votes
@ChetanJadhavCD
dpkg -s libgtk2.0-0|grep '^Version'
renvoie àVersion: 2.24.30-1ubuntu1.16.04.2
ydpkg -s libgtk-3-0|grep '^Version'
renvoie àVersion: 3.18.9-1ubuntu3.3
1 votes
Désolé @MarkusWeninger c'est la seule chose que j'avais en tête et que je pouvais suggérer, je ne sais pas quoi essayer d'autre à ce stade.
0 votes
J'ai rencontré un scénario similaire avec seulement les composants swing et je pense qu'il s'agit d'un problème avec l'application
GKT
l'impasse. Ces postes bugs.eclipse.org/bugs/show_bug.cgi?id=341538 y bugs.eclipse.org/bugs/show_bug.cgi?id=341799 m'a aidé à résoudre le problème en appelantgdk_threads_leave()
avant que Swing/AWT ne distribue les threads.0 votes
@hari Merci pour votre aide. Depuis que j'ai posé cette question, nous avons porté tous les SwingNodes. Si je trouve le temps, je vais mettre en place une application d'exemple pour le tester.
1 votes
Par ailleurs, ne devrait-il pas y avoir un
break
dans votre if ?