2014-04-26 2 views
3

Je suis en train d'écrire une application qui nécessite des widgets à utiliser différents regards & se sent. Le reste de l'application utilise le système look & sentir.Look & Feel problèmes sur Ubuntu

Mon approche à ceci était lors de l'initialisation de l'application pour échanger le LF pour celui désiré, créer le composant, puis réinitialiser le LF. Cela a bien fonctionné sur les systèmes d'exploitation Windows, mais en le testant sur Ubuntu, il a échoué à définir la LF pour le composant d'une manière bizarre. Sur Ubuntu, UIManager.getSystemLookAndFeelClassName() indique que le LF est un javax.swing.plaf.metal.MetalLookAndFeel. C'est le premier problème - je m'attends à ce qu'il renvoie com.sun.java.swing.plaf.gtk.GTKLookAndFeel. Ce qui est étrange, c'est que mon approche fonctionne quand le programme utilise le LF Metal, mais échoue lors de l'utilisation de la GTK LF, où il place la totalité de l'image et tous ses composants dans la GTK LF.

Le SSCCE suivant illustre le problème:

import javax.swing.*; 
import java.awt.*; 

import static javax.swing.UIManager.*; 

public class LaFTest { 
    public static void main(String[] argv) throws ReflectiveOperationException, UnsupportedLookAndFeelException { 
     String[] keys = { 
       "java.specification.version", 
       "java.version", 
       "java.vm.version", 
       "java.specification.vendor", 
     }; 
     for (String key : keys) { 
      System.out.printf("%-40s%s\n", key, System.getProperty(key)); 
     } 

     System.out.println(UIManager.getSystemLookAndFeelClassName()); 

     // Swap for "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" 
     setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     JFrame frame = new JFrame("LaF Test"); 
     Container content = frame.getContentPane(); 
     content.setLayout(new GridLayout(2, 0)); 
     JButton button = new JButton("System"); 
     content.add(button); 

     LookAndFeel previous = getLookAndFeel(); 
     for (LookAndFeelInfo feel : getInstalledLookAndFeels()) { 
      if (feel.getName().equals("Nimbus")) { 
       setLookAndFeel(feel.getClassName()); 
      } 
     } 

     JButton second = new JButton("Nimbus"); 
     content.add(second); 

     setLookAndFeel(previous); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

Notez, cependant, que je ne suis pas sûr en ce qui concerne la reproductibilité de cette question. Comme Google rapide ne montre aucun problème similaire, il peut être quelque chose de spécifique à ma machine. Quoi qu'il en soit, il a persisté lors de la mise à jour d'Ubuntu 12 à 13 et 13 à 14. De là, je suppose que c'est un problème avec Swing et non le système sous-jacent.

La sortie du programme ci-dessus est, sur ma machine,

java.specification.version    1.7 
java.version       1.7.0_51 
java.vm.version       24.51-b03 
java.specification.vendor    Oracle Corporation 
javax.swing.plaf.metal.MetalLookAndFeel 

Utilisation de la sensation métallique, la fenêtre qui est

with metal feel

Permutation pour la sensation GTK,

GTK feel overriding

Je joue avec ça depuis un moment maintenant, sans résultat. Y a-t-il quelque chose qui me manque? Quelqu'un peut-il reproduire cela, et si c'est le cas, est-ce un bug dans la distribution Java ou mon code? Y a-t-il un meilleur moyen d'atteindre mon objectif?

+0

Je ne comprends pas vraiment votre question. Voulez-vous montrer deux boutons sur un panneau avec 2 regards différents et se sent? Je ne pense pas que cette approche était en quelque sorte destinée (même quand cela peut fonctionner) ... – Ben

+0

Plan long mais ajoutez une impression à l'intérieur if (feel.getName(). est égal à ("Nimbus")) pour s'assurer que nimbus L & F est disponible post-GTK. – Java42

Répondre

0

J'aurais aimé déboguer cela en profondeur, mais une date limite imminente m'a forcé à installer le package Oracle Java, qui a corrigé le problème. Une réponse décevante, mais elle a définitivement résolu le problème.