2011-09-08 18 views
5

Tengo un ListCellRenderer personalizado y me gustaría utilizar el color de fondo de selección predeterminado de Nimbus. Puedo buscar el color con el:¿Cómo uso un color Nimbus predeterminado con UIManager?

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

y si lo imprimo, que tiene los mismos valores que en Nimbus default colors. Pero cuando lo uso en un JPanel obtengo un color gris diferente, ¿cómo puedo usar el color de UIManager?

Cuando hago:

setBackground(Color.RED); 

El apaisada JPanels se muestra en rojo, pero cuando lo hago:

setBackground(selectionBackground); 

El color "selectionBackground" es no utilizado, pero un color gris .


Aquí es un ejemplo y captura de pantalla:

enter image description here

El fondo debe ser:

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

¿Es posible que la siguiente pregunta lo ayude con Nimbus - http://stackoverflow.com/questions/5840599/jbutton-background-on-nimbus-laf? –

+1

Guau, muy extraño. Revisé el código: el color devuelto es del tipo javax.swing.plaf.ColorUIResource. Pero no veo cómo eso puede causar ningún problema ya que es una subclase de Color. No hay nada especial en el código de ColorUIResource, ninguna referencia a la interfaz de usuario ni nada. Como sugirió Joey, 'selectionBackground = new Color (selectionBackground.getRGB());' funciona. – toto2

Respuesta

4

Nimbus aparentemente resiste que sus colores se utilizan en otros lugares. Me topé con esto hace un tiempo y en aquel momento mi mejor solución fue crear un nuevo Color usando los componentes (puedes consultar) y usar eso. Por supuesto, entonces te quedas con ese color incluso si se cambia el L & F.

Sé que ese es el objetivo de un DerivedColor que obtiene de UIManager. No he encontrado una mejor solución sin embargo.

Esto va de manera similar para otros L & Fs y otras cosas también. P.ej. la GTK L & F estará encantado de darle los iconos que desea tener, pero no dibujarán sus propios controles. Supongo que parte de todo esto es que Swing es (a) terriblemente complejo y (b) no L & F en realidad se adhiere a los contratos, ni siquiera Nimbus, a pesar de ser el más nuevo y más fresco.

+0

¿Dónde se define DerivedColor? ¿Te refieres a [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

No creo que Nimbus "resista" a la hora de configurar el color. Supone erróneamente que no ha anulado el valor predeterminado porque UIManager.getColor() devuelve una instancia de ColorUIResource.

ColorUIResource es simplemente un Color que implementa la interfaz de marcador UIResource. De acuerdo con Javadoc, L & Fs "usa esta interfaz para decidir si un valor de propiedades ha sido anulado". Nimbus comprueba el color de fondo, se da cuenta de que no lo ha anulado y recurre a un comportamiento interno que no está esperando.

Cuestiones relacionadas