2011-09-08 11 views
5

Ho un ListCellRenderer personalizzato e desidero utilizzare il colore di sfondo predefinito di selezione Nimbus. Posso occhiata il colore con:Come utilizzare un colore Nimbus predefinito con UIManager?

Color selectionBackground = UIManager.getColor("nimbusSelectionBackground"); 

e se lo stampo, ha gli stessi valori su Nimbus default colors. Ma quando lo uso su un JPanel ottengo un diverso colore grigio, come posso usare il colore da UIManager?

Quando faccio:

setBackground(Color.RED); 

backround JPanels è mostrato in rosso, ma quando lo faccio:

setBackground(selectionBackground); 

Il colore "selectionBackground" è non usato, ma un colore grigio .


Ecco un esempio e screenshot:

enter image description here

Lo sfondo dovrebbe essere:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UIManager.LookAndFeelInfo; 

public class PanelColor { 

    public static void main(String[] args) { 

     // switch to Nimbus Look And Feel 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       try { 
        UIManager.setLookAndFeel(info.getClassName()); 
       } catch (Exception e) { e.printStackTrace(); } 
       break; 
      } 
     } 

     Color selectionBackground = UIManager.getColor("nimbusSelectionBackground"); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.setPreferredSize(new Dimension(300,50)); 
     panel.add(new JLabel(selectionBackground.toString()), BorderLayout.NORTH); 

     // is not showing the selectionBackground color 
     panel.setBackground(selectionBackground); 

     JFrame frame = new JFrame(); 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

È possibile che la seguente domanda possa essere d'aiuto con Nimbus: http://stackoverflow.com/questions/5840599/jbutton-background-on-nimbus-laf? –

+1

Wow, molto strano. Ho controllato il codice: il colore restituito è di tipo javax.swing.plaf.ColorUIResource. Ma non vedo come ciò possa causare problemi poiché è una sottoclasse di Colore. Non c'è nulla di speciale nel codice di ColorUIResource, nessun riferimento all'interfaccia utente o altro. Come suggerito da Joey, 'selectionBackground = new Color (selectionBackground.getRGB());' funziona. – toto2

risposta

4

Nimbus resiste a quanto pare che i suoi colori sono utilizzati altrove. Ci siamo imbattuti anche in questo caso un po 'di tempo fa e allora la mia soluzione migliore era creare un nuovo Color usando i componenti (puoi interrogare) e usarlo. Certo, quindi si rimane con quel colore anche se il L & F viene modificato.

So che è il punto intero di un DerivedColor che si ottiene da UIManager. Non ho trovato una soluzione migliore però.

Questo vale anche per altre L & F e altre cose. Per esempio. la GTK L & F ti darà felicemente le icone che vuoi avere ma non disegneranno nei tuoi stessi controlli. Immagino che una parte di tutto ciò sia che Swing è (a) orribilmente complesso e (b) no L & F là fuori aderisce effettivamente ai contratti, nemmeno a Nimbus, nonostante sia il più nuovo e il più bello.

+0

Dove è definito DerivedColor? Intendi [NimbusLookAndFeel.getDerivedColor] (http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/nimbus/NimbusLookAndFeel.html#getDerivedColor%28java.lang.String,%20float,%20float,%20float, % 20int,% 20boolean% 29)? – Gili

5

Non credo che Nimbus "resiste" impostando il colore. Suppone erroneamente che non sia stato sovrascritto il valore predefinito perché UIManager.getColor() restituisce un'istanza di ColorUIResource.

ColorUIResource è semplicemente un Colore che implementa l'interfaccia del marcatore UIResource. Secondo Javadoc, L & Fs "usa questa interfaccia per decidere se un valore di proprietà è stato sovrascritto". Nimbus controlla il colore di sfondo, ha notato che non l'hai sovrascritto e ricade su un comportamento interno che non ti aspetti.

Problemi correlati