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?
Vc precisa usar um JTextPane.
Vou fazer um exemplo, já posto p/ vc.
[]´s
D
davidbuzatto
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:
importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JColorChooser;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JTextPane;importjavax.swing.text.MutableAttributeSet;importjavax.swing.text.StyleConstants;/** * * @author David Buzatto */publicclassTesteJTextPaneextendsJFrame{privateJTextPanetextPane;privateJButtonbtnCorTexto;privateJButtonbtnCorFundo;privateColorcorTexto;privateColorcorFundo;privateJPanelpainelCorTexto;privateJPanelpainelCorFundo;publicTesteJTextPane(){setTitle("Teste JText Pane");setDefaultCloseOperation(EXIT_ON_CLOSE);setSize(500,500);textPane=newJTextPane();btnCorTexto=newJButton("Cor Texto");btnCorFundo=newJButton("Cor Fundo");painelCorTexto=newJPanel();painelCorFundo=newJPanel();// cores padrãocorTexto=Color.BLACK;corFundo=Color.WHITE;// para mostrar a cor utilizada no momento....painelCorTexto.setPreferredSize(newDimension(15,15));painelCorTexto.setBackground(corTexto);painelCorFundo.setPreferredSize(newDimension(15,15));painelCorFundo.setBackground(corFundo);// monta a interfaceJPanelpainelBtns=newJPanel();painelBtns.add(btnCorTexto);painelBtns.add(painelCorTexto);painelBtns.add(btnCorFundo);painelBtns.add(painelCorFundo);add(textPane,BorderLayout.CENTER);add(painelBtns,BorderLayout.SOUTH);// registra os manipuladores de eventosbtnCorTexto.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){ColorcorEscolhida=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(newActionListener(){publicvoidactionPerformed(ActionEvente){ColorcorEscolhida=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. */privatevoidmudarEstilo(JTextPanetextPane,ColorcorTexto,ColorcorFundo){// obtém o attribute set do textPaneMutableAttributeSetattr=textPane.getInputAttributes();// muda os atributos desejadosStyleConstants.setForeground(attr,corTexto);StyleConstants.setBackground(attr,corFundo);}publicstaticvoidmain(String[]args){newTesteJTextPane();}}
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
davidbuzatto
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.