47 votes

Essayer de styliser des SwingNodes dans JavaFX avec GTKLookAndFeel gèle l'application

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é.

1voto

arturios Points 943

Les composants gui doivent être mis à jour dans les threads gui.

Essayez l'une des méthodes suivantes :

SwingUtilities.invokeLater(() -> {
//commands
});

javafx.application.Platform.runLater(() -> {
//commands
});

0 votes

J'ai essayé les deux avant, et les deux ne résolvent pas le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X