Rolagem automatica com JTextPane e JScrollPane

Não estou conseguindo realizar a rolagem automática em um JTextPane,
usei a mesma implementação do JTextArea ( nessa funciona normal )

segue o codigo

	public void rolaTela(){
			try {
				
				txtpnl.scrollRectToVisible( txtpnl.modelToView(txtpnl.getDocument().getLength()) );
			} catch (BadLocationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}

Esse codigo abaixo funciona normalmente, mas preciso utilizar html então mudei para JTextPane, conforme codigo anterior.

        public void rolaTela(){
			try {
				
				textArea.scrollRectToVisible(textArea.modelToView(textArea.getDocument().getLength()));
			} catch (BadLocationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}

O método que estou utilizando para atualizar o JTextPane é o seguinte

public void escreveNaTela(String msg) {
 /* txt é um atributo da classe que armazena o conteúdo do JTextPane, 
 * foi necessário para fazer a concatenação dos textos, o JTextPane não possui um .append()
 */  
		txt = txt + msg;
		txtpnl.setText(txt);
		rolaTela();
}

O que devo fazer para que seja feito a rolagem automática? quando executo o codigo utilizando o JTextPane gera uma exceçao de nullpointer

[color=red]java.lang.NullPointerException
at javax.swing.JComponent.scrollRectToVisible(Unknown Source)
at Chat.TelaCliente.rolaTela(TelaCliente.java:108 )[/color]

Agradeço a ajuda.
[]`s

Tem que usar o depurador e ver o que está null aí.

Vc tem certeza que não chamou o método rolaTela() antes de criar o textarea?

[quote=ViniGodoy]Tem que usar o depurador e ver o que está null aí.

Vc tem certeza que não chamou o método rolaTela() antes de criar o textarea?[/quote]

Tenho certeza q o textpane foi criado antes q o rolaTela(). Quando eu altero o tipo do obj de jtextpane para jtextarea o método funciona normal.

Achei uma solução mas está apresentando uma falha, a tela não rola sempre até o final. A maioria das vezes ela rola e exibe a ultima linha, mas tem vezes q rola para o meio e depois de escrever varias msgs volta a rolar ate o fim.

segue o novo codigo que estou utilizando

public void rolaTela() {
        Rectangle visibleRect = txtpnl.getVisibleRect();
        visibleRect.y = txtpnl.getHeight();
        txtpnl.scrollRectToVisible(visibleRect);
    }

Confesso q prefiro o codigo anterior que eu usava em um JtextArea, ele rolava perfeitamente ate o final, esse JTextPane está dando dor d cabeça.

E quanto ao nullpointer acho q é do método txtpnl.modelToView();
OBS: o txtpnl.getDocument().getLenght(); está normal… retornando o tamanho do Document

ACHEI A SOLUÇÃO !!! em um forum gringo

Adicionei um AdjustmentListener no scrollpane e está perfeito agora :slight_smile:

[code] scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {

	    BoundedRangeModel brm = scrollPane.getVerticalScrollBar().getModel();
	    boolean wasAtBottom = true;
		@Override
		public void adjustmentValueChanged(AdjustmentEvent arg0) {
			// TODO Auto-generated method stub
			 if (!brm.getValueIsAdjusting()) {
		           if (wasAtBottom)
		              brm.setValue(brm.getMaximum());
		        } else
		           wasAtBottom = ((brm.getValue() + brm.getExtent()) == brm.getMaximum());

		     }
	});[/code]

Agradeço aos que tentaram me ajudar
:slight_smile: