Colorir linhas

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.

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

[]´s

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:

[code]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();
    }

}[/code]
[]´s

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

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().

[quote=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().[/quote]

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

[]´s