Quiero usar un color de fondo diferente para todos mis JPanels en una aplicación. Cómo puedo hacer que cuando el uso de estas zapatillas de Mirar y Sentir?

Sigo Cambiar el Tema de Color para cambiar el color de los componentes de Nimbus ven y se Sienten.

Sólo funciona a veces, al azar. Si me puse un PropertyChagneListener antes de que cambie el color, es sólo notificado una vez.

Aquí es algunas código de prueba:

public class RedPanels extends JFrame {

  public RedPanels() {
    JPanel panel = new JPanel();
    add(panel);
    setPreferredSize(new Dimension(100, 100));
    pack();
    setVisible(true);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {

        try {
          for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                UIManager.getDefaults().addPropertyChangeListener(
                                               new PropertyChangeListener() {

                  @Override
                  public void propertyChange(PropertyChangeEvent event) {
                    if (event.getPropertyName().equals("Panel.background")) {
                      System.out.println("color changed");
                    }

                });
                UIManager.put("Panel.background", new Color(255,0,0));
                break;
            }
          }
        } catch (Exception e) {
            //Nimbus is not available.
        }
        new RedPanels();
        }
    });
  }
}
  • Me gustaría poner en un cierto código para permitir que usted para ver si a alguien/algo más paliza Panel.de fondo.
  • He añadido un PropertyChangeListener para Panel.background ahora, ver a mi código. Pero nunca notificado, ni siquiera cuando me puse el color.
  • de nuevo (mi culpa, no concentrada, la hora de la comida 😉 La única propiedad de la clase UIManager sabe de es «lookAndFeel», que se notifica a sus oyentes acerca de un cambio de la LAF, pero no acerca de los cambios de los valores almacenados en él (afair) por CIERTO, no se si Nimbus honores el color de fondo almacenada en la interfaz de usuario, que había habido problemas
  • Tienes razón, he actualizado mi código con el propertyChangeListener, ahora se escucha en el UIDefaults.
  • Sí, esto parece ser un problema. He seguido este tutorial Cambiar el Tema de Color
  • Disculpas, sí, ahora lo veo. @kleopatra veo la necesidad de volver a pintar cuando la lnf los cambios, pero usted hizo mención de que es falso. ¿Me olvido de algo?
  • Me puse los colores antes de la interfaz es iniciado. Por lo que nunca cambia.
  • Me gusta lo que tiene arriba (incluyendo a Igor la respuesta de abajo). Pero, ¿cómo puedo cambiar, digamos, el color de fondo del panel sobre la marcha en puntos arbitrarios de largo después de que la interfaz de usuario ha sido creada una instancia?

InformationsquelleAutor Jonas | 2011-11-23

3 Comentarios

  1. 2

    hay tres maneras

    1) reemplazar nimbusBase para establecer DerivedColor

    2) crear propia Painter, sólo un ejemplo de ello es no -> aephyr codesource,

    3) simple y sucio truco para establecer el Color directamente

    Cómo cambiar el color de fondo para JPanels con Nimbus Mirada y la Sensación?

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.LineBorder;
    public class NimbusJPanelBackGround {
    public NimbusJPanelBackGround() {
    JPanel p = new JPanel();
    UIDefaults nimbusOverrides = new UIDefaults();
    nimbusOverrides.put("Panel.background", Color.blue);
    p.putClientProperty("Nimbus.Overrides", nimbusOverrides);
    SwingUtilities.updateComponentTreeUI(p);
    JPanel p1 = new JPanel();
    nimbusOverrides = new UIDefaults();
    nimbusOverrides.put("Panel.background", Color.green);
    p1.putClientProperty("Nimbus.Overrides", nimbusOverrides);
    SwingUtilities.updateComponentTreeUI(p1);
    p1.setBorder(new LineBorder(Color.black, 1));
    JPanel p2 = new JPanel();
    nimbusOverrides = new UIDefaults();
    nimbusOverrides.put("Panel.background", Color.ORANGE);
    p2.putClientProperty("Nimbus.Overrides", nimbusOverrides);
    SwingUtilities.updateComponentTreeUI(p2);
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.add(p, BorderLayout.NORTH);
    f.add(p1, BorderLayout.CENTER);
    f.add(p2, BorderLayout.SOUTH);
    f.setSize(200, 100);
    f.setLocation(150, 150);
    f.setVisible(true);
    }
    public static void main(String[] args) {
    try {
    for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
    if ("Nimbus".equals(laf.getName())) {
    UIManager.setLookAndFeel(laf.getClassName());
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    NimbusJPanelBackGround nimbusJPanelBackGround = new NimbusJPanelBackGround();
    }
    });
    }
    }
    • No, es no una alternativa para establecer los colores para cada componente, es cientos de ellos. Necesito una manera de cambiar los colores de todos ellos en un solo lugar.
    • usted puede poner componente con las mismas propiedades (significado de Fondo, primer plano, el Borde de la Fuente) para cualquiera que sea la Matriz y el cambio que de esta manera, comprobar aephyr código fuente, creo que hay tres formas 🙂
    • Creo que la única manera es dejar de usar Nimbus.
    • como se decidió, tenga en cuenta que usted tiene que calcular que otros Personalizado de L&F son tan sensibles a EDT, no hay sorpresas 🙂
  2. 2

    Parece un bug en el jdk6, Panel.antecedentes una de las propiedades no se toman medidas. Siguientes obras jdk7 (nota de la secuencia: en primer lugar establecer el color, a continuación, la LAF)

     UIManager.put("Panel.background", new Color(255,0,0));
    UIManager.setLookAndFeel(info.getClassName());

    Mi conjetura es que es todavía de alguna manera buggy, como Nimbus se supone que la actualización de sus propiedades en la recepción de cualquier cambio en los gestores de configuración, por lo que invertir la secuencia para establecer Nimbus, a continuación, poner el color) debería funcionar así, pero ni siquiera en el jdk7

     UIManager.setLookAndFeel(info.getClassName());
    UIManager.put("Panel.background", new Color(255,0,0));
    //UIManager.put("control", Color.MAGENTA);

    Parece ser específica para el Panel.de fondo (y probablemente un montón de otros), «control» está bien en tanto jdks, tanto antes como después de la configuración de la LAF.

    • Yo uso JDK7 para todos mis exámenes, así que sólo funciona «a veces» en el JDK7, incluso el primero de sus ejemplos.
    • hmm … que significa: ejecución de su código con el put(«Panel.de fondo», …) se trasladó al inicio del bloque try sólo funciona de forma esporádica? O que otras propiedades no funcionan? o …? De todos modos, que suena mal – esperaba que jdk7 había resuelto la mayoría de la Nimbus peculiaridades …

Dejar respuesta

Please enter your comment!
Please enter your name here