Saltar al contenido

Como cambiar el Skin a tu aplicacion: Uso de Substance

febrero 13, 2009

Ya visitaste el nuevo blog?? www.quanaxoft.com/blog

A quienes han buscado la manera de cambiar la apariencia  la interfaz gráfica de una aplicación hecha con swing de java, es decir, cambiarle el skin/tema a su aplicación, dejo el siguiente tutorial que hace uso de la libreria «Substance», un proyecto relativamente famoso y muy utilizado para el cambio de «Look and feel»  pero con poca documentación en Español, es así que nos dimos un poco de tiempo para entender como aplicar algunas de sus funciones y publicárselos de la manera más sencilla con el afán de que les sea de utilidad.

Ejemplo de uso de Substace
Ejemplo de uso de Substace

Las versiones con las que se trabaja son: Substance 4.3, JDK  6 update 10 y Netbeans 6.5

1.    Descargar Libreria y agregar al proyecto.

El primer paso es descargar la libreria del Substance 4.3 de https://substance.dev.java.net/servlets/ProjectDocumentList?folderID=9911&expandFolder=9911&folderID=9100 . Es un archivo .jar que pesa alrededor de 1.7Mb y que debemos de agregar a nuestro proyecto.

Descargamos el archivo .jar para posteriormente agregarlo a nuestro proyecto como libreria

Descargamos el archivo .jar de la pagina del proyecto: https://substance.dev.java.net

agregamos el archivo a nuestro proyecto

En Netbeans agregamos el archivo a nuestro proyecto como libreria

2. Aplicar los Skins de Substance

Existen varias formas de aplicar un Skin de substance. La manera mas sencilla de aplicarlo es desde la clase main antes de hacer la llamada a cualquier JFrame con las 2 siguientes  sentencias:

JFrame.setDefaultLookAndFeelDecorated(true); //que nos permite dejar a Substance la decoracion ( por asi decirlo)
SubstanceLookAndFeel.setSkin(«org.jvnet.substance.skin.CremeSkin»); // Setencia que aplica el skin Creme de Substance
La manera mas facil de aplicar Substance

La manera mas facil de aplicar Substance

Metal

La clase Ventana que es un JFrame con diversos componentes. Con el Look and feel por default en java: Metal

Ventana con el skin "CremeSkin"

Ventana con el skin "CremeSkin" de Substance

La lista de Skins para Substance 4.3 esta dada a continuación, así solo se debe cambiar el parametro a la funcion SubstanceLookAndFeel.setSkin() para aplicar el skin deseado:

– org.jvnet.substance.skin.AutumnSkin
– org.jvnet.substance.skin.BusinessBlackSteelSkin
– org.jvnet.substance.skin.BusinessBlueSteelSkin
– org.jvnet.substance.skin.BusinessSkin
– org.jvnet.substance.skin.CremeCoffeeSkin
– org.jvnet.substance.skin.CremeSkin
– org.jvnet.substance.skin.EmeraldDuskSkin
– org.jvnet.substance.skin.FieldOfWheatSkin
– org.jvnet.substance.skin.FindingNemoSkin
– org.jvnet.substance.skin.GreenMagicSkin
– org.jvnet.substance.skin.MagmaSkin
– org.jvnet.substance.skin.MangoSkin
– org.jvnet.substance.skin.MistAquaSkin
– org.jvnet.substance.skin.ModerateSkin
– org.jvnet.substance.skin.NebulaBrickWallSkin
– org.jvnet.substance.skin.NebulaSkin
– org.jvnet.substance.skin.OfficeBlue2007Skin
– org.jvnet.substance.skin.OfficeSilver2007Skin
– org.jvnet.substance.skin.RavenGraphiteGlassSkin
– org.jvnet.substance.skin.RavenGraphiteSkin
– org.jvnet.substance.skin.RavenSkin
– org.jvnet.substance.skin.SaharaSkin

Apariencia de los Skins de Substance

Apariencia de los Skins de Substance

3. Cambiar el Tema

El cambio de tema es como cambiar el skin pero Substance los maneja en otro paquete el cual nos proporciona otra lista de themes con una muy buena variedad de colores. La diferencia en su implentación es que va después de haber aplicado un skin o Look and feel y la sentencia que sebe aplicar es:

SubstanceLookAndFeel.setCurrentTheme( «org.jvnet.substance.theme.SubstanceAquaTheme» ); // Se aplica el tema Aqui de Substance
Es requisito haber aplicado primero un Skin pero la apariencia sera del theme declarado

Es requisito haber aplicado primero un Skin pero la apariencia sera del theme declarado

Ejemplo de la aplicacion del theme Aqua de Substance

Ejemplo de la aplicacion del theme Aqua de Substance

La lista de temas en Substance 4.3 es dada a continuación, de igual manera para cambiar de tema tan solo  cambiar el String de parametro en la funcion SubstanceLookAndFeel.setCurrentTheme():

– org.jvnet.substance.theme.SubstanceAquaTheme
– org.jvnet.substance.theme.SubstanceBarbyPinkTheme
– org.jvnet.substance.theme.SubstanceBottleGreenTheme
– org.jvnet.substance.theme.SubstanceBrownTheme
– org.jvnet.substance.theme.SubstanceCharcoalTheme
– org.jvnet.substance.theme.SubstanceCremeTheme
– org.jvnet.substance.theme.SubstanceDarkVioletTheme
– org.jvnet.substance.theme.SubstanceDesertSandTheme
– org.jvnet.substance.theme.SubstanceEbonyTheme
– org.jvnet.substance.theme.SubstanceJadeForestTheme
– org.jvnet.substance.theme.SubstanceLightAquaTheme
– org.jvnet.substance.theme.SubstanceLimeGreenTheme
– org.jvnet.substance.theme.SubstanceNegatedTheme
– org.jvnet.substance.theme.SubstanceOliveTheme
– org.jvnet.substance.theme.SubstanceOrangeTheme
– org.jvnet.substance.theme.SubstancePurpleTheme
– org.jvnet.substance.theme.SubstanceRaspberryTheme
– org.jvnet.substance.theme.SubstanceSaturatedTheme
– org.jvnet.substance.theme.SubstanceSepiaTheme
– org.jvnet.substance.theme.SubstanceSteelBlueTheme
– org.jvnet.substance.theme.SubstanceSunGlareTheme
– org.jvnet.substance.theme.SubstanceSunsetTheme
– org.jvnet.substance.theme.SubstanceTerracottaTheme

Apariencia de los themes de Substance

Apariencia de los themes de Substance

4. Cambiar el Watermark

En el Watermark se permite cambiar el fondo/Background de los componentes contenedores en un JFrame o similares, desde el uso de watermarks predeterminados en Substance hasta colocar una imagen  y cambiar los valores de transparencia de ésta. La Sentencia para aplicarlo es con la funcion setCurrentWatermark() de la clase SubstanceLookAndFeel:

SubstanceLookAndFeel.setCurrentWatermark(«org.jvnet.substance.watermark.SubstanceBinaryWatermark»);//Ejemplo de aplicacion de un watermark de Substance
Implementacion de Watermark en main

Implementacion de Watermark en main

Observa el fondo de la ventana compuesto por unos y ceros. Se aplico BinaryWatermark de Substance

Observa el fondo de la ventana compuesto por unos y ceros. Se aplico BinaryWatermark de Substance

La lista de Watermarks de Substance 4.3 es:

– org.jvnet.substance.watermark. SubstanceBubblesWatermark
– org.jvnet.substance.watermark. SubstanceBinaryWatermark
– org.jvnet.substance.watermark. SubstanceCopperplateEngravingWatermark
– org.jvnet.substance.watermark. SubstanceCrosshatchWatermark
– org.jvnet.substance.watermark. SubstanceFabricWatermark
– org.jvnet.substance.watermark. SubstanceGenericNoiseWatermark
– org.jvnet.substance.watermark. SubstanceImageWatermark
– org.jvnet.substance.watermark. SubstanceKatakanaWatermark
– org.jvnet.substance.watermark.SubstanceLatchWatermark
– org.jvnet.substance.watermark. SubstanceMagneticFieldWatermark
– org.jvnet.substance.watermark. SubstanceMarbleVeinWatermark
– org.jvnet.substance.watermark.SubstanceMazeWatermark
– org.jvnet.substance.watermark. SubstanceMetalWallWatermark
– org.jvnet.substance.watermark.SubstanceNoneWatermark
– org.jvnet.substance.watermark.SubstanceNullWatermark
– org.jvnet.substance.watermark. SubstancePlanktonWatermark
– org.jvnet.substance.watermark. SubstanceStripeWatermark
– org.jvnet.substance.watermark. SubstanceWoodWatermark

Apariencia de los Watermarks de Substance

Apariencia de los Watermarks de Substance

4.1 Watermak de imagen

Una función interesante es  proporcionar una imagen propia para colocarlo de watermark en la aplicación; para esto utilizaremos el SubstanceImageWatermark instaciándolo y proporcionando  la ruta de la imagen como parámetro.

SubstanceLookAndFeel.setCurrentWatermark( new SubstanceImageWatermark(«c:\\tuxx.jpg»));
Se utiliza SubstanceImageWatermark con la ruta de la imagen como parámetro

Se utiliza SubstanceImageWatermark con la ruta de la imagen como parámetro

Imagen a utilizar para aplicarla como watermark

Imagen a utilizar para aplicarla como watermark

Resultado de aplicar ImageWatermark

Resultado de aplicar ImageWatermark

4.1.1 Opacidad de la imagen

Substance también permite cambiar la opacidad de la imagen del watermark através de la función setImageWatermarkOpacity() al cual se debe pasar el valor en flotante entre 0 y 1, siendo 1 la opacidad nula.

SubstanceLookAndFeel.setImageWatermarkOpacity(new Float(0.3));//valor aproximado de la opacidad por default de imageWatermark
implementacion de la opacidad de la imageWatermark en main

implementacion de la opacidad de la imageWatermark en main

Opacidad de la imagenWatermark a un valor de 0.6

Opacidad de la imagenWatermark a un valor de 0.6

Opacidad de la ventana a un valor de 0.9

Opacidad de la ventana a un valor de 0.9

Opciones para Componentes.

Muchas opciones de Substance son para su aplicación a Componentes Swing específicos, aquí se verán algunass de ellas para Botones, Combobox, Tabpane y otras funciones que se pueden aplicarse a varios.

Botones.

5. Redondear los botones.

La propiedad de cliente BUTTON_SHAPER_PROPERTY de Substance permite cambiar  la clasica forma rectangular del boton a una  más redondeada que puede hacerlo resaltar más o hacerlo mas amigable, por ejemplo.  La implementación se realiza desde la clase del JFrame (en mi caso la clase Ventana) en el constructor . Se debe pasar un objeto Shape que es la forma que tomará el boton y la cual proporcionara Substance: StandardButtonShaper que es un Shape que da redondeo al botón.

this.jButton1.putClientProperty( SubstanceLookAndFeel.BUTTON_SHAPER_PROPERTY, new StandardButtonShaper());
Se aplica una propiedad de cliente al boton que deseamos cambiar su forma
Se aplica una propiedad de cliente al boton que deseamos cambiar su forma
Aplicacion de la forma StandardButtonShaper de Substance al jbutton1

Aplicacion de la forma StandardButtonShaper de Substance al jbutton1

6. Lado de abertura de un botón

Permite que un cualquier lado de un boton esté abierto, es decir, acotado en espacio y borde de lado seleccionado: botton,  left, up, right. La propiedad BUTTON_SIDE_PROPERTY acota el area de lado y BUTTON_OPEN_SIDE_PROPERTY elimina el borde de tal costado.

this.jButton1.putClientProperty( SubstanceLookAndFeel.BUTTON_SIDE_PROPERTY, SubstanceConstants.Side.LEFT); this.jButton1.putClientProperty( SubstanceLookAndFeel.BUTTON_OPEN_SIDE_PROPERTY, SubstanceConstants.Side.LEFT);
Los parametros Substance los proporciona con SubstanceConstants

Los parametros Substance los proporciona con SubstanceConstants

Aplicacion de la propiedad a Jbutton1 con el cremeCoffee como skin
Aplicacion de la propiedad a Jbutton1 con el cremeCoffee como skin
Los 4 tipos de aberturas de lado de un boton
Los 4 tipos de aberturas de lado de un boton
58 comentarios leave one →
  1. Edgar Castro permalink
    marzo 9, 2009 2:19 pm

    Ombre muchas gracias por el aporte desde Monteria – Cordoba – Colombia estube casi 4 meses buscando un tutorial sobre los Skins de Java y no habia podido encontrar gracias muchas gracias

  2. marzo 10, 2009 9:47 pm

    esta bien chido esto, no sabia que se podia hacer eso con java, cambiar el look, lo malo es que al realizar mis proyectos uso los formularios de netbeans que tienen un buen de codigo y no pude hacer que funcionara, pero lo investigare y se si como se soluciona te lo comento.

    gracias…

  3. carlberto permalink
    marzo 11, 2009 9:00 am

    Que tal!, me da gusto que sea de utilidad para uds, la vdd es que Substance es una libreria con muchas configuraciones, y aun faltan muchas! espero volver a poster otras pocas mas en un futuro cercano, por lo mientras sigan comentando y aportando, Sldox!

  4. JOse permalink
    marzo 17, 2009 10:56 am

    Hola ! no sabes de la que me salvaste calberto gracias llevaba unbuen timpo buscando esto y menos mal encontre tu blog ,yo trabajo con formularios pero lo solucione,oe » skuarch » si todavia necesitas ayuda me puedes escribir a «gandalf_gris_89@hotmail.com» para enviarte la solucion (para leerlo ponle urgente java) bye saludos a todos.

  5. JOse permalink
    marzo 17, 2009 10:57 am

    gracias calberto ,crei que olvidaba lo mas importante!

  6. carlberto permalink
    marzo 17, 2009 9:15 pm

    Me da gusto que te sirviera y ojala pudieras compartir la solucion por aqui u otro medio para los que tienen un problema similar, por lo que veo eso de las plantillas genera problemas pero creo que viendo el codigo fuente podrian adaptarlo, de manera general lo que se hizo en el tutorial fue: Crear un nuevo proyecto en Netbeans (File>New Proyect>Java aplicacion) de la cual se genera la clase ‘main’; Se agrega un ‘JFrame Form’ al paquete del proyecto (que genera la clase con nombre Ventana en este caso), y desde ‘main’ crear la instancia tal como se muestra el la imagen ‘La manera mas facil de aplicar Substance’. El agregado de componentes a la ventana es independiete de cada aplicacion y el metodo ‘setVisible(true)’ yo lo pongo en el constructor de la clase Ventana, se ve en la imagen ‘Los parametros Substance los proporciona con SubstanceConstants’.

    Sldox!

  7. JOse permalink
    marzo 18, 2009 1:49 am

    ok bueno , estoy acostumbrado a File>New Proyect>Java aplicacion pero desactivo el main class y le doy finish despues le agrego el JFrame Form… ahi por defecto aparece el «public static void main(String args[]) » y pues solo agregue lo de tu tutorial . abajo te dejo el codigo de algo simple que hice =)

    //////////////////////////////////////
    package Interface;
    import org.jvnet.substance.SubstanceLookAndFeel;
    import org.jvnet.substance.button.StandardButtonShaper;
    import org.jvnet.substance.utils.SubstanceConstants;
    public class Formulario extends javax.swing.JFrame
    {
    /** Creates new form Formulario */
    public Formulario()
    {
    initComponents();
    this.jButton2.putClientProperty(SubstanceLookAndFeel.BUTTON_SHAPER_PROPERTY, new StandardButtonShaper());
    this.jButton2.putClientProperty(SubstanceLookAndFeel.BUTTON_SIDE_PROPERTY, SubstanceConstants.Side.RIGHT);
    }
    @SuppressWarnings(«unchecked»)
    //
    private void initComponents() {

    jToolBar1 = new javax.swing.JToolBar();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
    jLabel1 = new javax.swing.JLabel();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();
    jMenu3 = new javax.swing.JMenu();
    jMenu5 = new javax.swing.JMenu();
    jMenu2 = new javax.swing.JMenu();
    jMenu4 = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jToolBar1.setRollover(true);

    jButton1.setForeground(new java.awt.Color(255, 255, 255));
    jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource(«/PaqueteFinal/folder_blue_parent.png»))); // NOI18N
    jButton1.setText(«AbrirBase de Datos»);
    jButton1.setFocusable(false);
    jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
    jButton1.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
    jToolBar1.add(jButton1);

    jButton2.setText(«Jose»);

    jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource(«/Interface/firefox_023.png»))); // NOI18N

    jMenu1.setIcon(new javax.swing.ImageIcon(getClass().getResource(«/PaqueteFinal/folder_blue_mydocuments.png»))); // NOI18N
    jMenu1.setText(«Archivo»);

    jMenu3.setIcon(new javax.swing.ImageIcon(getClass().getResource(«/PaqueteFinal/folder_blue_explorer.png»))); // NOI18N
    jMenu3.setText(«Open»);

    jMenu5.setIcon(new javax.swing.ImageIcon(getClass().getResource(«/PaqueteFinal/folder_blue.png»))); // NOI18N
    jMenu5.setText(«Folder»);
    jMenu3.add(jMenu5);

    jMenu1.add(jMenu3);

    jMenuBar1.add(jMenu1);

    jMenu2.setIcon(new javax.swing.ImageIcon(getClass().getResource(«/PaqueteFinal/folder_beige_scheduled_tasks.png»))); // NOI18N
    jMenu2.setText(«Edicion»);

    jMenu4.setIcon(new javax.swing.ImageIcon(getClass().getResource(«/PaqueteFinal/folder_blue_printer.png»))); // NOI18N
    jMenu4.setText(«Copiar»);
    jMenu2.add(jMenu4);

    jMenuBar1.add(jMenu2);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 800, Short.MAX_VALUE)
    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
    .addContainerGap(674, Short.MAX_VALUE)
    .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 116, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addContainerGap())
    .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
    .addComponent(jLabel1)
    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 359, Short.MAX_VALUE)
    .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addContainerGap())
    );

    pack();
    }//
    public static void main(String args[])
    {
    Formulario.setDefaultLookAndFeelDecorated(true);
    SubstanceLookAndFeel.setSkin(«org.jvnet.substance.skin.RavenSkin»);

    java.awt.EventQueue.invokeLater(new Runnable()
    {
    public void run()
    {
    new Formulario().setVisible(true);
    }
    });
    }
    // Variables declaration – do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenu jMenu4;
    private javax.swing.JMenu jMenu5;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JToolBar jToolBar1;
    // End of variables declaration

    }
    /////////////////////
    y eso fue todo….
    bye saludos …

    ***porfavor****
    si puedes sube un tuto de como conectar el MySQL con netbeans 6.1
    con uso de tablas y toda la cosa

    te lo agradeceria muxo….

  8. JOse permalink
    marzo 18, 2009 1:52 am

    ummmmm creo que tambien copie la parte del codigo que la maquina genera
    package Interface;
    import org.jvnet.substance.SubstanceLookAndFeel;
    import org.jvnet.substance.button.StandardButtonShaper;
    import org.jvnet.substance.utils.SubstanceConstants;
    public class Formulario extends javax.swing.JFrame
    {
    /** Creates new form Formulario */
    public Formulario()
    {
    initComponents();
    this.jButton2.putClientProperty(SubstanceLookAndFeel.BUTTON_SHAPER_PROPERTY, new StandardButtonShaper());
    this.jButton2.putClientProperty(SubstanceLookAndFeel.BUTTON_SIDE_PROPERTY, SubstanceConstants.Side.RIGHT);
    }
    public static void main(String args[])
    {
    Formulario.setDefaultLookAndFeelDecorated(true);
    SubstanceLookAndFeel.setSkin(«org.jvnet.substance.skin.RavenSkin»);

    java.awt.EventQueue.invokeLater(new Runnable()
    {
    public void run()
    {
    new Formulario().setVisible(true);
    }
    });
    }
    lo que hice es solo esto by =).

  9. JOse permalink
    marzo 18, 2009 1:54 am

    sorry por el lapsus espero que e disculpen gracias bye y porfa lo de la base de datos .

  10. carlberto permalink
    marzo 18, 2009 7:30 pm

    Gracias por tu aporte JOse, para conectar una base de datos requieres el Driver Mysql y añadirlo a tu proyecto, para la ejecución de las querys encontre los links: http://jhodrickgg.wordpress.com/2007/11/30/conectar-mysql-a-java-netbeans/y meterte al manejo del Jtable, creo que podrias hallar otras varias soluciones en google. Sldox!

  11. JOse permalink
    marzo 19, 2009 2:35 am

    bueno gracias por tu apoyo ahora tratare de terminar mi tarea…
    by saludos.

  12. Youssef permalink
    marzo 26, 2009 10:13 pm

    buenos días, he usado los metodos que has expuesto aquí, pero cuando se me cambio el aspecto de mi aplicación, tengo un problema, ya que los combos que tienen un desplegables con distintos valores cundo selecciono alguno, se me selecciona , pero aparece como si no he seleccionado nada, pero el valor está ahi, lo que pasa que no se ve, y no he conseguido dar con la solucion: si alguien sabe algo, porfavor contestarme en cuanto podais , un saludo

  13. marzo 27, 2009 9:22 pm

    mmm eso lo responde carlberto… donde andara? jajaja

  14. carlberto permalink
    marzo 27, 2009 10:16 pm

    jajaj, que tal Youssef te pediriria que me proporciones el nombre del skin o theme de Substance que utilizas para verificar lo que te sucede y una breve descripcion de lo que hiciste con codigo, la vdd que no se que pueda ser. Sldox!

  15. Youssef permalink
    marzo 30, 2009 9:01 am

    pues mira, he usado el Nimrod, he usado los que habeis proporcionado en esta pagina, en concreto el coffeCream Skin y otro mas, en el caso de Nimrod he probado con la sentencia en mi Main: UIManager.setLookAndFeel( new com.nilo.plaf.nimrod.NimRODLookAndFeel());
    importando la libreria correspondiente. igual hice con el CoffeCream, pero me pasa lo mismo aunque en el caso del CoffeCream son mas lineas de codigo:
    String path = PathUtil.packageToPath(«ruta de la clase LookAndFeel», «Nombre_del_Skin.zip»); SkinLookAndFeel.setSkin(SkinLookAndFeel.loadThemePack(this.getClass().getResource(path)));
    UIManager.setLookAndFeel(new SkinLookAndFeel());
    el problema es que con Nimrod me desaparecen los Combos, pero como sé donde estan los puedo seleccionar, pero no me aparece mi seleccion.
    con los skins de esta pagina, me aparecen los combos, pero igualement no me aparece mi seleccion, he pensado en incluir alguna instruccion pero aplicando el skin en particular al combo igual que para el UIManagr. a ver que me podeis decir, gracias saludos.

  16. carlberto permalink
    marzo 30, 2009 11:47 pm

    Que tal youssef, hice unas pequenias pruebas con el skin para tratar de simular tu problema pero apesar de que cambie varias propiedades del combobox, el skin mantiene su aspecto y los items siguen viendose . Me parece que el problema es cuestion de las versiones que estas manejando (asegurate de usar Java 6) pues el problema lo tienes aun con dos librerias distintas o de la utilizacion del combo (asegurate de utilizar solo componentes swing en toda la aplicacion). Sugeriria tambien que hicieras un nuevo proyecto con nuevos componentes swing para ver si el alcance es solo de ese proyecto. Finalmente una manera mas facil de aplicar el Substance con el UIManager: UIManager.setLookAndFeel(«org.jvnet.substance.skin.SubstanceCremeCoffeeLookAndFeel»);
    con sus respectivas capturas de excepciones, aunque sugiero y prefiero los metodos explicados en este post, al parecer mas limpios. Sldox!

  17. mabril permalink
    marzo 31, 2009 9:51 am

    Mira carlberto, tengo un problemilla.

    Antes todo enhorabuena por la entrada, pues está genial y he conseguido usar el L&F.

    Mi problema sucede por lo siguiente:
    Dispongo de un sistema de 5 ventanas que cuando les aplico cualquier L&F su aspecto cambia en todas menos en la ventanas principal.
    Ya he conseguido localizar el por qué de este problema. En dicha ventana, tengo una imagen en un label que, cada cierto tiempo esa imagen cambiará (es decir, que el propio programa hace las oportunas modificaciones a la imagen y la vuelve a cargar en el mismo label).
    Dicha imagen tiene la opción debugGraphicsOptions con el parámetro FLASH_OPTION.
    Si cambio este parámetro por el que está por defecto, NONE_OPTION, el problema desaparece, se aplica el L&F en la ventana, pero mi imagen ya no se cambia.

    ¿Sabrías como solucionar este pequeño problemilla?

    Gracias

  18. carlberto permalink
    abril 2, 2009 9:23 pm

    Hola mabril!, disculpa por hasta ahora responderte pero ya sabes como pasa de rapido el tiempo jejej, acerca del problema que me comentas intente hacer la prueba habilitando la opcion debugGraphicsOptions del label y efectivamente se genera una excepcion de casting; sinceramente no he trabajado con esta propiedad pero me parece que se trate de un bug de substance :s ya que con el «nimrod» (otro look and feel) no hay problema alguno. :Por el momento: solo puedo sugerirte que trates de realizar tu cargado de imagen por otro metodo o bien utilices otros skins, te dejo algunos links: nimrod: http://personales.ya.com/nimrod/index.html, este es un recopiltorio: http://www.javootoo.com/, espero te sirva de algo y en caso de arreglar tu problema compartas la solucion, Sldox!

  19. Roggee permalink
    abril 25, 2009 9:11 pm

    Hola, quisiera agradecerte por tu post, he estado buscando por semanas como cambiarle la triste apariencia a la que java me tenia acostumbrado, ahora con esto mis proyectos se ven mucho mejor. Queria hacerte saber de un problema, no se si a alguien mas le paso, io trabajo con netbeans 6.5 y segui todos tus pasos para usar la libreria substance, mientras estoy en el entorno netbeans todo funciona bien, PERO cuando intento ejecutar el jar generado de mi proyecto desde la consola con : «java -jar proyecto.jar» , parece que substance no funciona muy bien, el renderizado de las pantallas y formularios es malo, no se actualizan cada ves que intento hacer un cambio , como presionar un boton o el simple hecho de mover un formulario, me manda errores en los que se repite el nombre de la clase substance, todo esto lo veo desde la consola, entonces queria saber si es un bug de la libreria o algo estoy haciendo mal, es poco probable que sea por que no adjunto las librerias, ya que tengo otras librerias agregadas al proyecto y funciona a las mil maravillas, quitando el hecho de que no se ven bien por el skin…Solo queria saber si me puedes ayudar con esto. y gracias una ves mas por tu tutorial

  20. RamBai permalink
    May 5, 2009 3:29 am

    Esta muy bueno, felicito a la persona que haya puesto esto, ya tenia un buen rato buscando como cambiar la apariencia a mis aplicaciones java, ya que los que trae por defecto, bueno no tiene nada de malo pero todas las aplicaciones que hago pos tiene lo mismo y que como que se me hace muy aburrido y feo asi, pero ahora estara todo mas depejado jejejejeje, bueno os felicito y que pasen una bonito dia…….

  21. May 5, 2009 6:32 am

    Hola, oye tengo un problemita, yo utilizo linux y al querer poner una imagen de fondo me marca un error, seguramente la ruta esta mal, añadí la imagen al proyecto, segun yo con eso solo tengo que poner la imagen entre comillas y ya «imagen.jpg» pero no jala, igual y lo que no sé es como poner las rutas en el linux, nunca me había pasado creeras jiji, bueno ya intente con /home/yuliana/imagen.jpg y nada la neta si sabes como poner la ruta te lo agradeceria mucho, desde ya un saludote y mil gracias por el aporte que esta genial, me saco de un apuro 😛 , pero lo de la imagen seria la perfección. Ojala puedas ayudarme.

  22. Alex permalink
    junio 9, 2009 5:37 am

    Hola Carlberto, estuve siguiendo tu post para utilizar los Skins de Substance sobre una aplicación que tengo que desarrollar y al parecer todo funcionaba bien, pero al probar completamente el sistema me sucedió lo siguiente.
    Estoy desarrollando un chat simple mediante un applet, para ello utilizo un JList como un campo general para que allí lleguen los mensajes con su respectivo DefaultListModel para manipular así los mensajes de texto que lleguen del servidor, bueno hasta ahí todo bien pues si envío un mensaje me llega normalmente, pero si yo utilizo el método ensureIndexIsVisible (método que tiene como parámetro la longitud del DefaultListModel al receptar un mensaje) sobre el Jlist para que así el jlist se deslice hasta el último mensaje de texto recibido se produce el siguiente error:

    java.lang.NullPointerException
    at javax.swing.BufferStrategyPaintManager.flushAccumulatedRegion(BufferStrategyPaintManager.java:398)
    at javax.swing.BufferStrategyPaintManager.copyArea(BufferStrategyPaintManager.java:326)
    at javax.swing.RepaintManager.copyArea(RepaintManager.java:1232)
    at javax.swing.JViewport.blitDoubleBuffered(JViewport.java:1604)
    at javax.swing.JViewport.windowBlitPaint(JViewport.java:1573)
    at javax.swing.JViewport.setViewPosition(JViewport.java:1118)
    at javax.swing.JViewport.scrollRectToVisible(JViewport.java:415)
    at javax.swing.JComponent.scrollRectToVisible(JComponent.java:3063)
    at javax.swing.JList.ensureIndexIsVisible(JList.java:1118)
    at cliente.EntradaCliente.run(EntradaCliente.java:92)
    Exception in thread «AWT-EventQueue-1» java.lang.NullPointerException
    at javax.swing.BufferStrategyPaintManager.flushAccumulatedRegion(BufferStrategyPaintManager.java:402)
    at javax.swing.BufferStrategyPaintManager.endPaint(BufferStrategyPaintManager.java:362)
    at javax.swing.RepaintManager.endPaint(RepaintManager.java:1281)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5076)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

    Lo extraño es que este error no se registra en el primer mensaje recibido sino en el octavo o noveno mensaje recibido, te agradecería mucho que me ayudes con este problema, pues cuando le quito el uso del skin de substance de mi aplicación el sistema funciona correctamente.

  23. aluuckard permalink
    junio 24, 2009 3:04 am

    buen tuto me ayudo de mucho gracias

  24. orlen permalink
    julio 16, 2009 6:45 pm

    Hola te fecilitto por tu blog, hay muchas personas con buenas intenciones de ayudar explicando un temas solo que no se explican bien, tu eres de los que explicas de una manera no complicada eso te lo agradesco.
    Queria preguntarte algo
    ya aplico bien el skin pero estoy utilizando windows y no me deja hacer referencia a la imagen de fondo del watermark, queria ver si me podias ayudar explicand como se hace paso a paso.
    yo encontre este post en otro sitio.

    JFrame con Imagen de Fondo

    allí explican como hacer un Jframe con fondo creo que deberia de funcionar pero no sé algo hago mal.

    gracias.

  25. Ragnarok permalink
    julio 18, 2009 12:20 am

    gracias buen tutorial…solo una cosa al momento de aplicarlo me achica los JMenu de mi Menu Bar y sin el skin los coloca normal alguien tiene alguna idea de porque podra pasar ?

  26. david permalink
    agosto 6, 2009 8:14 pm

    Buenas.. muchas gracias por el tutorial.. la verdad esta super interesante.. una pregunta.. no saben si este mismo metodo para cambiar el skin y demas tambien me sirve para el eclipse?? o se tiene que hacer de otra manera.. desde ya muchas gracias…

  27. Susan permalink
    agosto 6, 2009 8:25 pm

    hola.. yo queria saber si estas librerias sirven tbn para la plataforma eclipse???
    muchisimas gracias..

  28. Rafe permalink
    septiembre 7, 2009 6:22 pm

    Substance contiene solo lo que has mostrado o hay mas????….

  29. saro permalink
    septiembre 29, 2009 8:17 am

    Hola gracias por el aporte, esta buenisimo bien explicado. Felicitaciones

  30. Gustavo permalink
    septiembre 30, 2009 8:08 pm

    Holas estoy usando una imagen como watermark perose me presenta el siguiente problema;si la imagen es muy grande no la toma y si es muy pequeña no se ve bien.

    estoy usando el MAXIMIZED_BOTH para maximizar la ventana principal , alguien me puede ayudar necesito que la imagen abarque el tamaño de la ventana per no se como

  31. Isaac permalink
    octubre 1, 2009 11:26 pm

    Muchas gracias por el tutorial, ESTA MUY BUENO…

  32. octubre 15, 2009 8:19 pm

    muy interesante su tutorial…
    pero tengo un problema al parecer el link no esta habilitado para la decarga
    de substance.jved pero ncontre uno de version 5.0
    pero no tiene la opcion de .setcurrent y por ende no puedo cambiar el tema
    agradeceria su repuesta 🙂

  33. Elizabeth Manrique permalink
    octubre 15, 2009 11:52 pm

    despues de mucho investigar encontre la solucion al gran problema..para quienes les interese..pues cuando se quiera agregar el efecto substance al jar pues tienen que modificar el archivo manifest(Meta-Inf) que hay dentro del jar , teniendo esta forma:

    Manifest-Version: 1.0
    Ant-Version: Apache Ant 1.7.1
    Main-Class: ClasePrincipal(Aqui va la localizacion de su clase Principal MainClass)
    Class-Path: lib/substance.jar
    Created-By: 14.2-b01 (Sun Microsystems Inc.)
    Gracias por tu aporte ..Bye

  34. Cloudred permalink
    noviembre 2, 2009 8:22 am

    Hola…gracias por este enorme aporte para todos…mi problema es que no me jala el skin si lo pongo en el main…al llamar la ventana me marca errores

    java.lang.IllegalStateException: This method must be called on the Event Dispatch Thread
    at org.jvnet.substance.SubstanceLookAndFeel.setSkin(SubstanceLookAndFeel.java:1954)
    at org.jvnet.substance.SubstanceLookAndFeel.setSkin(SubstanceLookAndFeel.java:2060)
    at org.jvnet.substance.SubstanceLookAndFeel.setSkin(SubstanceLookAndFeel.java:2097)
    at mercado.Main.main(Main.java:26)

    este es mi main
    package mercado;

    import form.*;
    import javax.swing.JFrame;
    import org.jvnet.substance.*;
    /**
    *
    * @author Eduardo
    */
    public class Main {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
    JFrame.setDefaultLookAndFeelDecorated(true); //que nos permite dejar a Substance la decoracion ( por asi decirlo)
    SubstanceLookAndFeel.setSkin(«org.jvnet.substance.skin.RavenSkin»); // Setencia que aplica el skin Creme de Substance
    new vta().setVisible(true);
    //JFrame.setDefaultLookAndFeelDecorated(true); //que nos permite dejar a Substance la decoracion ( por asi decirlo)
    //SubstanceLookAndFeel.setSkin(«org.jvnet.substance.skin.RavenSkin»); // Setencia que aplica el skin Creme de Substance
    //vta ventana=new vta();
    //ventana.show(true);
    //ventana.setvisible(true);
    // TODO code application logic here
    }

    }

    esos comentarios son algunas cosas que trate de hacer pero ninguna funco…
    lo unico que si sale… es que si pongo los skins en los constructores de los JDialog que tengo ahi si se cambia el skin y tmb el de la ventana principal…

    alguna solucion?

  35. Angelo permalink
    marzo 2, 2010 6:20 am

    Muchas gracias por el tutorial, muy buena pagina…

    desde chile

    bye bye

  36. Frank permalink
    marzo 5, 2010 1:27 am

    oye me pueden pasar el proyecto paraejecutarlo en el Netbeans 6.5

  37. Marco permalink
    abril 15, 2010 9:18 pm

    Excelente solución, me funcionó perfectamente en Netbeans 6.7.1 Muchas gracias

  38. futbolyocio permalink
    May 7, 2010 5:01 am

    Gracias amigo por la información, excelente aporte!

  39. dan permalink
    May 9, 2010 6:23 pm

    esta bueno el tutorial, pero quisiera ver mas ejemplos de como cambiar otros componentes aparte de los botones.
    y ademas como ajustar una imagen de fondo al tamaño de la ventana.
    muchas gracias!

  40. junio 8, 2010 11:48 pm

    Muchisimas gracias, justo lo que estaba buscando para mejorar el Look & Feel de mi aplicación.

  41. nfuentes permalink
    junio 24, 2010 3:05 pm

    Que bien!!!
    funciona al 190%, gracias man

  42. Koiky permalink
    julio 29, 2010 11:56 pm

    amigoo, e intentado mucho pero no me agarra el — .set — me marca error
    ni me deja importar las librerias. no me da opcion i si las escibo todas asi me dice q no se usan nunca

    este es mi codigoo

    JFrame.setDefaultLookAndFeelDecorated(true);
    // //que nos permite dejar a Substance la decoracion ( por asi decirlo)
    SubstanceLookAndFeel.setSkin(«org.jvnet.substance.skin.BusinessBlackSteelSkin»);
    // // Setencia que aplica el skin Creme de Substance
    SubstanceLookAndFeel.setSkin(«org.jvnet.substance.skin.RavenSkin»);
    //CON ESTO CAMBIAMOS EL TEMAA DE LA APLICACION
    SubstanceLookAndFeel.setCurrentTheme( «org.jvnet.substance.theme.SubstanceAquaTheme» );
    // Se aplica el tema Aqui de Substance

    //ESTO CAMBIA EL WATERMARK (fondo del JFame)
    SubstanceLookAndFeel.setCurrentWatermark(«org.jvnet.substance.watermark.SubstanceBinaryWatermark»);
    //Ejemplo de aplicacion de un watermark de Substance

    gracias por su tutorial es de gran ayudaa

  43. Jokerdm permalink
    agosto 31, 2010 4:01 pm

    Great !!!

  44. jose permalink
    septiembre 10, 2010 4:45 am

    me sale el sgte errorr.

    Exception in thread «main» java.lang.ClassCastException: org.pushingpixels.substance.internal.plugin.BaseSkinPlugin cannot be cast to org.jvnet.substance.plugin.SubstanceSkinPlugin

  45. jose luis permalink
    octubre 17, 2010 2:33 am

    es primera ves que bisito esta web y si encontre lo que buscaba gracias por el material

  46. giam permalink
    octubre 27, 2010 2:14 am

    ok. te agradezco estaba buscando un buen tutorial.

  47. c_c permalink
    octubre 29, 2010 8:48 pm

    Este look & feel no me abre el cuadro de impresoras en linux alguien sabe porque? y como solucionarlo? , pues con otros look & feel si abre el problemas nada mas es con el Substance, gracias de antemano

  48. diciembre 23, 2010 2:22 pm

    Muy Buno, justo lo q buscaba…lo mejor..Funciona!!

  49. jorge permalink
    enero 2, 2011 5:34 pm

    Hola, esta muy bueno el blog mira tengo un problema con algunos de los elementos de la swingx-20007, el problema es que substance no soporta jXTaskPaneContainer, si me pudieras ayudar gracias si no tambien

    este es mi e-mail jorleohp@hotmail.com puedes escribirme.

    nuevamente gracias

  50. luis permalink
    octubre 3, 2011 7:32 pm

    Muy buena esta infor, me dio muchas ideas para un proyecto en el cual estoy trabajando, es un buen material

  51. antonio permalink
    diciembre 23, 2011 5:38 pm

    oye carnal esta muy padre tu aporte pero podrias enviarme la paqueteria a mi correo esk la pagina oficial esta desabilitada y no encuentro el substance por ningun lado este es mi correo antoni_anemi@hotmail.com muchas gracias de antemano

  52. Jarocho permalink
    enero 4, 2012 12:47 am

    Ese mi richi! mira… google ya manda a tu blog xD

  53. Jose Valdez permalink
    marzo 9, 2012 9:02 am

    Buenas, quisiera saber como hago para quitarle el theme ó en su caso el skin a un componente, es decir, tengo un JDateChooser que al aplicarle el skin el mismo se desconfigura, y quisiera setear el theme o skin a este componente.

    Gracias por la ayuda que me pudieran ofrecer.

  54. Jose permalink
    abril 6, 2012 12:24 am

    Hola,gracias a este blog pude cambiar mi apariencia de interfaz de usuario, pero tengo un problema al pasarle la direccion de la imagen, aqui esta el codigo
    SubstanceLookAndFeel.setCurrentWatermark( new SubstanceImageWatermark(«c:\\imagen.jpg»));
    el problema radica que cuando me llevo mi proyecto para otra pc pierde la referencia de la direccion que le puse anteriormente

  55. edwin permalink
    May 31, 2012 6:24 pm

    soy nuevo en java queria saber por que me aparece el error en el org (subrayado en rojo ) imorte el JAR hice los pasos que aparecian anteriormente pero nada

  56. NOE permalink
    agosto 20, 2012 10:16 pm

    Muy buen aporte, ya das más ideas de como decorar una aplicación de escritorio en java, muy buen apoyo…

  57. samuel permalink
    agosto 25, 2012 5:29 am

    EXCELENTE APORTE, FELICIDADES Y GRACIAS A LA VEZ..

  58. Víctor Juárez Cabrera permalink
    octubre 23, 2012 6:34 pm

    La verdad me ayudo bastante, Te mando un gran abrazo y un saludos desde México…

Deja un comentario