2017-05-04 7 views
35

Nous avons une application Java qui utilisait Swing, mais nous la migrons vers JavaFX. Par conséquent, nous enveloppons l'ancien code Swing dans SwingNode s et les remplaçons étape par étape. Avant la migration, l'application Swing utilisait com.sun.java.swing.plaf.gtk.GTKLookAndFeel comme apparence (par défaut sous Ubuntu). Nous avons utilisé le code suivant pour le définir (si disponible):Essayer de styler SwingNodes dans JavaFX avec GTKLookAndFeel fige l'application

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 réglage manuel du look-and-feel est nécessaire car nous voulons toujours styler les composants Swing qui n'ont pas été migrés vers JavaFX sur la base du GTKLookAndFeel.

Plus d'info: Cela ne ne fonctionne pas avec com.sun.java.swing.plaf.gtk.GTKLookAndFeel, car il fonctionne lors de l'utilisation javax.swing.plaf.metal.MetalLookAndFeel, javax.swing.plaf.nimbus.NimbusLookAndFeel ou com.sun.java.swing.plaf.motif.MotifLookAndFeel.

Que pouvons-nous faire pour le faire fonctionner avec GTKLookAndFeel pour styler nos composants Swing dans le SwingNode s?

+1

faites-vous dans le fil correct? Le code Swing doit être exécuté dans [EventQueue.invokeLater] (http://docs.oracle.com/javase/8/docs/api/java/awt/EventQueue.html#invokeLater-java.lang.Runnable-). – VGR

+0

@VGR: N'a pas fait cela avant, changé maintenant, mais ne change pas le comportement. Gèle toujours l'application. –

+1

Essayez de l'exécuter sur la ligne de commande et de vider toutes les piles de threads. Sur Windows, ceci est fait avec Ctrl-Break; sur d'autres systèmes, SIGQUIT le fera, accompli avec Ctrl- \ ou une commande 'kill -3' séparée. L'une des traces de pile devrait indiquer où setLookAndFeel est bloqué. – VGR

Répondre

-1

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

Essayez une des options suivantes:

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

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

Essayé à la fois avant, et les deux ne résolvent pas le problème. –