Mostrando las entradas con la etiqueta look and feel. Mostrar todas las entradas
Mostrando las entradas con la etiqueta look and feel. Mostrar todas las entradas

02 febrero, 2012

JTextArea transparente en Look & Feel Nimbus

Un problema que he observado al utilizar el look & feel 'Nimbus' de Java 6 es que las JTextArea mantenien el color de fondo blanco a pesar de que se ha invocado el método setOpaque(false).


Por lo que he leído, el problema se debe al diseño original de Swing. El metodo setOpaque() tiene el efecto de que el componente pueda no pintar alguno o todos sus pixeles, y en clases que extiendan a JComponent esto depende del look & feel.


En el caso de Nimbus, este look and feel requiere transparencia en los componentes para dibujar los bordes redondeados, por lo que los pixeles del componente deben ser pintados.


La solucion es utilizar un color de fondo transparente (alfa=0) y tambien un borde transparente a fin de que el efecto final sea un componente 100% transparente:




textArea.setBorder(BorderFactory.createEmptyBorder()); 

textArea.setBackground(new Color(0, 0, 0, 0));




Con esta simple operación, el componente será completamente transparente, no sólo omitiendo el dibujado de pixeles, sino haciendo que los pixeles que se dibujan sean realmente transparentes.







13 agosto, 2009

Control de Look and Feel en Swing

Un problema recurrente de los usuarios de aplicaciones
creadas en Java es el del look an feel. "No se ve como
si fuera windows" es el tipico comentario de quien usa
una aplicacion Swing en este sistema operativo. Los
usuarios de *nix estan mas acostumbrados a las diferencias
de l&f segun el toolkit de la aplicacion (gtk+, qt, motif.. etc)
y no suelen quejarse tanto.

Personalmente encuentro horrible el l&f por defecto (metal)
asi que tengo a mano un codigo que selecciona automaticamente
el l&f dependiendo del sistema:


----------

String jVersion = System.getProperty("java.version");
String os = System.getProperty("os.name");
String[] ver = jVersion.split("_");



if (ver.length > 0) {
    String vMajor = ver[0];
    Double update = Double.parseDouble(ver[1]);
    try {
       if ((vMajor.compareTo("1.6.0") > -1 && update >= 10) || (vMajor.compareTo("1.7.0") > -1)) {
           UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
       } else {
           if (os.toLowerCase().contains("windows")) {
           UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
       } else if (os.toLowerCase().contains("linux")) {
           UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
       }
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.WARNING, bundle.getString("error.lf"), ex);
    } catch (InstantiationException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.WARNING, bundle.getString("error.lf"), ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.WARNING, bundle.getString("error.lf"), ex);
    } catch (UnsupportedLookAndFeelException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.WARNING, bundle.getString("error.lf"), ex);
    }
}


----------

El codigo en si es bastante simple:

- Obtengo la version de la VM de java.
- Obtengo el nombre del sistema operativo.
- Obtengo el numero de actualizacion de la VM.

Desde el update 10 de la JVM 1.6 se encuentra disponible
el l&f "Nimbus", asi que si nuestra version de JVM es
1.6_10 o superior se selecciona este L&F para la
aplicacion. En caso contrario si el sistema es Windows
se selecciona el L&F de Windows, si el OS es Linux
se selecciona el L&F GTK (como quisiera un l&f QT!!!).

Si no es posible seleccionar alguno de estos L&F se
mantendra el por defecto (metal).

Bastara con que este codigo se inserte en el main() de
nuestra aplicacion Swing, antes que se dibuje el primer
JFrame y lo demas sera coser y cantar.

Esta solucion es muy simple y utiliza las bibliotecas
estandar de la JVM. No obstante podemos extender
las capacidades de L&F de nuestra aplicacion utilizando
la completisima biblioteca substance.




bytes!!