2014-09-03 6 views
0

J'ai une série de composants JComponents qui ont un aspect et une convivialité, je souhaite ensuite définir temporairement un nouveau look and feel afin d'ajouter de nouveaux composants avant de revenir à l'original. Le code ci-dessous montre un exemple de trois JButtons, dans lequel l'apparence de 'Button 1' et 'Button 3' devrait être identique, avec 'Button 2' différant. Le code fourni inverse l'apparence générale, mais les lookandfeeldefaults qui sont définies manuellement (c'est-à-dire font la police) sont perdues. À votre santé.Modification temporaire de l'apparence et de la sensibilité par défaut dans Java Swing

EDIT: Désolé, la question est légèrement trompeuse: tous les changements de look and feel se produisent avant le panneau est affiché, comme on le voit dans l'exemple de code. Cette question est différente de la duplication suggérée comme le problème ici est de recharger les propriétés manuellement (UIManager.getLookAndFeelDefaults().put(...)), contrairement à l'aspect général. La raison sous-jacente de cette question est que je dois ajouter un JButton avec une couleur d'arrière-plan remplie à un panneau, et setBackground ne définit que la bordure d'un JButton en utilisant le windows look and feel alors que le cross platform look and feel remplit l'arrière-plan.

MISE À JOUR: La solution consiste à utiliser UIManager.getLookAndFeelDefaults().putAll(previousLF); au lieu de setLookAndFeel. Le code a été mis à jour en conséquence.

import java.awt.Color; 
import java.awt.Font; 
import javax.swing.*; 
import javax.swing.UIManager.LookAndFeelInfo; 

public class test { 
    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       //Set initial look and feel. 
       try{ 
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
        UIManager.getLookAndFeelDefaults().put("Button.font", new Font("Arial", Font.PLAIN, 20)); 
       } catch (Exception e){} 
       JButton button1 = new JButton("1"); 

       //change look and feel for button two. 
       UIDefaults previousLF = UIManager.getLookAndFeelDefaults(); 
       try { 
        UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
        UIManager.getLookAndFeelDefaults().put("Button.background", Color.BLUE); 
       } catch (Exception e) {} 
       JButton button2 = new JButton("2"); 

       //Revert look and feel. 
       try { 
        UIManager.getLookAndFeelDefaults().putAll(previousLF); 
       } catch (Exception e) {} 
       JButton button3 = new JButton("3"); 

       //Add buttons to panel and display for testing purposes. 
       JPanel testPanel = new JPanel(); 
       testPanel.add(button1); 
       testPanel.add(button2); 
       testPanel.add(button3); 
       JOptionPane.showMessageDialog(null, testPanel); 
      } 
     }); 
    } 
} 

Répondre

3

.

UIManager.setLookAndFeel(lnfName); 
SwingUtilities.updateComponentTreeUI(frame); 
frame.pack(); 
  • dans votre cas doit être utilisé variable locale pour JButton (au lieu de JFrame) trop (valable pour une partie de JComponents en utilisant MetalLookAndFeel, WindowsLookAndFeel)

  • for example

+0

Salut mKorbel merci pour la réponse. Puisque tous les composants (sans tenir compte de l'aspect ou de la sensation) sont ajoutés au cadre avant qu'il ne soit affiché, la mise à jour de l'arbre des composants ne semble pas faire de différence; à la place je m'attendrais à une méthode sur le modèle de 'UIManager.setLookAndFeelDefaults (...)', bien que je n'arrive pas à en trouver un. – Hungry

+0

@ btrs20 JButton a [tableaux de couleurs] (http://stackoverflow.com/questions/5751311/creating-a-custom-button-in-java-with-jbutton/5755124#5755124), par exemple. [Liste des couleurs de JButton] (http://stackoverflow.com/a/5845007/714968) défini dans javax.swing.plaf.ColorUIResource pour la clé Button.background comme couleur – mKorbel

+0

Je suis un peu confus, est-ce lié à mon réponse à Romeo? Si oui, alors suggérez-vous que j'écrive ma propre classe de boutons pour avoir une couleur de fond remplie? – Hungry

0

Je ne pense pas que PLAF est destiné à assigner un aspect et des sens différents aux différents composants de swing.

Pour quelle raison n'utilisez-vous pas ce qui suit?

button2.setBackground(bg); 
+0

Salut Roméo, malheureusement, je dois changer l'aspect et la convivialité depuis la définition de la couleur d'arrière-plan d'un JButton en utilisant l'apparence des fenêtres et ne change que l'apparence de sa bordure, plutôt que le bouton entier. – Hungry

+0

Ok désolé, heureusement, vous avez de meilleures réponses que les miennes;) –

Questions connexes