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