06 febrero, 2012

Agregar Texto en color a un JTextPane

De vez en cuando se me ha hecho necesario utilizar un JTextPane para entregar mensajes al usuario conforme se realiza una tarea. Por lo mismo es muy importante que el usuario pueda detectar rápidamente mensajes de error y que mejor para esto que utilizar colores en el texto. Los mensajes normales pueden ir en negro, los mensajes de error en rojo, etc.



Para ello se puede utilizar la clase StyledDocument de Java que permite definir algunas caracteristicas del texto que se insertará en el JTextPane


Sin más, he decidido crear una clase que extienda de JTextPane y que proporcione los métodos que necesito:



public class Consola extends JTextPane {



    public void append(Color color, String texto) {
        StyledDocument doc = getStyledDocument();
        Style syle = doc.addStyle("txt", null);
        StyleConstants.setForeground(syle, color);
        try {
             doc.insertString(doc.getLength(), texto, syle);
             setCaretPosition(doc.getLength());
         } catch (BadLocationException ex) {
             ex.printStackTrace();
         }
    }



    public void appendRed(String texto) {
        append(Color.RED, texto);
    }


    public void append(String texto) {
        append(Color.BLACK, texto);
    }


}



Una solución simple que puede ser de gran utilidad. Jugando un poco con las clases StyledDocument, Style y StyleConstants pueden obtenerse resultados muy interesantes.





bytes!

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.