Colorir linhas

5 respostas
K

Boa tarde, estou tentando colorir o fundo das linhas de acordo com o conteúdo delas, entretanto, todas as linhas depois da primeira condição estão sendo coloridas.
Por exemplo: quero colorir as linhas que comecem com “+” de vermelho. O código pinta a linha e o resto do texto adiante. Como faço para que ele pinte apenas a linha?

Segue meu code:

public class FileFormatter 
{   	
	public void print(ArrayList<String> lines)
	{		
		JTextArea printer = MainGui.diff;
		int offset = 0;
		int lenght = 0;
		for(int i=0; i < lines.size(); i++)
		{
			offset = printer.getText().length();	
			printer.append(lines.get(i));
			lenght = printer.getText().length();	

			color(lines.get(i).toString(), offset, lenght);			
		}
	}
	
	public void color(String value, int start, int end) 
	{     
		Highlighter highlighter = MainGui.diff.getHighlighter(); 
	    Highlighter.HighlightPainter rem = new DefaultHighlighter.DefaultHighlightPainter(new Color(255, 0, 0)); 
	    Highlighter.HighlightPainter add = new DefaultHighlighter.DefaultHighlightPainter(new Color(0, 204, 255)); 
	    
	    try
	    {
		    if(value.startsWith("+") && !value.startsWith("+++")) 
		    	highlighter.addHighlight(start, end, add); 
		    else if(value.startsWith("-") && !value.startsWith("---")) 
		    	highlighter.addHighlight(start, end, rem); 
	    }
	    catch(BadLocationException e)
	    {
	    	//e.printStackTrace();
	    }
	} 
}

Obs.: Os valores de offset e lenght estão retornando corretamente.

5 Respostas

D

Vc precisa usar um JTextPane.
Vou fazer um exemplo, já posto p/ vc.

[]´s

D

KaL,

Fiz um exemplo bem simples. Um JFrame com alguns componentes e um método para mudar o estildo do JTextPane.
Note que construi a interface na mão.

Segue o código:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.StyleConstants;

/**
 *
 * @author David Buzatto
 */
public class TesteJTextPane extends JFrame {

    private JTextPane textPane;
    private JButton btnCorTexto;
    private JButton btnCorFundo;
    private Color corTexto;
    private Color corFundo;
    private JPanel painelCorTexto;
    private JPanel painelCorFundo;


    public TesteJTextPane() {

        setTitle( "Teste JText Pane" );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setSize( 500, 500 );

        textPane = new JTextPane();
        btnCorTexto = new JButton( "Cor Texto" );
        btnCorFundo = new JButton( "Cor Fundo" );
        painelCorTexto = new JPanel();
        painelCorFundo = new JPanel();
        
        // cores padrão
        corTexto = Color.BLACK;
        corFundo = Color.WHITE;

        // para mostrar a cor utilizada no momento....
        painelCorTexto.setPreferredSize( new Dimension( 15, 15 ) );
        painelCorTexto.setBackground( corTexto );

        painelCorFundo.setPreferredSize( new Dimension( 15, 15 ) );
        painelCorFundo.setBackground( corFundo );

        // monta a interface
        JPanel painelBtns = new JPanel();
        painelBtns.add( btnCorTexto );
        painelBtns.add( painelCorTexto );
        painelBtns.add( btnCorFundo );
        painelBtns.add( painelCorFundo );

        add( textPane, BorderLayout.CENTER );
        add( painelBtns, BorderLayout.SOUTH );


        // registra os manipuladores de eventos
        btnCorTexto.addActionListener( new ActionListener() {

            public void actionPerformed( ActionEvent e ) {

                Color corEscolhida = JColorChooser.showDialog( null,
                        "Escolha uma Cor para o Texto", corTexto );

                if ( corEscolhida != null ) {

                    corTexto = corEscolhida;
                    painelCorTexto.setBackground( corTexto );

                    mudarEstilo( textPane, corTexto, corFundo );

                    textPane.requestFocus();

                }

            }

        });

        btnCorFundo.addActionListener( new ActionListener() {

            public void actionPerformed( ActionEvent e ) {

                Color corEscolhida = JColorChooser.showDialog( null,
                        "Escolha uma Cor para o Fundo do Texto", corFundo );

                if ( corEscolhida != null ) {

                    corFundo = corEscolhida;
                    painelCorFundo.setBackground( corFundo );

                    mudarEstilo( textPane, corTexto, corFundo );

                    textPane.requestFocus();

                }

            }

        });

        setVisible( true );

    }

    /* Esse método poderia acessar as cores e o textPane diretamente, visto que 
     * eles são campos da classe, mas fiz dessa forma p/ vc poder reaproveitar.    
     */
    private void mudarEstilo( JTextPane textPane, Color corTexto, Color corFundo ) {

        // obtém o attribute set do textPane
        MutableAttributeSet attr = textPane.getInputAttributes();

        // muda os atributos desejados
        StyleConstants.setForeground( attr, corTexto );
        StyleConstants.setBackground( attr, corFundo );

    }

    public static void main( String[] args ) {
        new TesteJTextPane();
    }

}
[]´s
D

Tem esse tópico aqui tbm http://www.guj.com.br/posts/list/94001.java onde postei um projetinho do NetBeans. Está um pouco diferente.

[]´s

K

Obrigado pela ajuda!
Consegui resolver meu problema.

Eu pesquisei antes sobre o JTextPane, mas decidi usar o JTextArea por causa do método append, pois não sei exatamente como fazer para separar as linhas do texto, pintá-las e unir novamente (talvez com um split de “\n”, mas acho que daria um pouco de trabalho). Por isso escolhi o TextArea que me daria a possiblidade de formatar o texto antes de adicioná-lo.
Depois de vários testes descobri que o problema estava na array lida, pois tinha uma quebra de linha. Então para corrigir o problema tirei a quebra de linha da array e adicionei separadamente dentro do for().

D

KaL:
Obrigado pela ajuda!
Consegui resolver meu problema.

Eu pesquisei antes sobre o JTextPane, mas decidi usar o JTextArea por causa do método append, pois não sei exatamente como fazer para separar as linhas do texto, pintá-las e unir novamente (talvez com um split de “\n”, mas acho que daria um pouco de trabalho). Por isso escolhi o TextArea que me daria a possiblidade de formatar o texto antes de adicioná-lo.
Depois de vários testes descobri que o problema estava na array lida, pois tinha uma quebra de linha. Então para corrigir o problema tirei a quebra de linha da array e adicionei separadamente dentro do for().

Dê uma olhada no link que passei do projeto feito no NetBeans.
Lá a inserção do texto é sempre feita no final.

[]´s

Criado 16 de outubro de 2010
Ultima resposta 16 de out. de 2010
Respostas 5
Participantes 2