2010-12-11 12 views
1

Si j'utilise java look and feel en actionPerfomée après un clic sur un bouton, le changement d'effet ne fonctionne pas correctement, à la place il change légèrement.java look and feel et main

Cependant, si je mets le même code sur le main, cela fonctionne correctement.

Quelle serait la solution pour cela?

+0

Modifier le look and feel (comment le changer, BTW?) Affecte [JFrames nouvellement créé] (http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/JFrame .html # setDefaultLookAndFeelDecorated (booléen)) – khachik

Répondre

3

Lorsque vous modifiez l'aspect et la convivialité avant de disposer le gui, tous les composants de l'interface utilisateur savent comment dessiner eux-mêmes. Si vous le changiez à un stade ultérieur, vous devez mettre à jour l'arborescence de l'interface utilisateur pour effectuer les modifications propagées à tous les composants:

UIManager.setLookAndFeel(lnfName); 
SwingUtilities.updateComponentTreeUI(frame); 
frame.pack(); 

Voir la java documentation à ce sujet.

Voici un exemple simple qui change le look and feel lorsque vous appuyez sur le bouton:

public static void main(String[] args) { 

    final JFrame frame = new JFrame("Test"); 

    frame.add(new JButton(new AbstractAction("Press to change") { 

     int current = 0; 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels(); 
      LookAndFeelInfo laf = lafs[current++ % lafs.length]; 

      try { 
       UIManager.setLookAndFeel(laf.getClassName()); 
       SwingUtilities.updateComponentTreeUI(frame); 
       frame.pack(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    })); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
} 

Si vous ne voulez pas pack la frame (changer la taille de celui-ci) il suffit d'appeler repaint à la place.