JTextArea - Limitar nº caracteres

Oi Galera, como eu faço para limitar o número de caracteres de um JTextArea?

Valeu

Abs.

Ja tentou implementar uma action listener com um keyEvent?

Ainda não.

Como eu limitaria o JTextArea implementando isso?

Não é tão simples como parece. No KeyListener, você ainda teria problemas com copy&paste.

Ainda bem que o GUJ tem este tutorial que te explica como fazer isso usando a interface Document.

O Vini tem razão, possui essa falha mesmo, mas se quiser o código é só procurar por KeyEvent, ai quando ele digitar vc faz um getText e verifica por lenght();

Pois é, o java devia ter esse recurso como padrão. Nem que fosse já fornecendo um documento pronto, só para isso. Não é à toa que citei isso nas coisas que odeio em java.

Pessoal, não estou conseguindo, desculpem a minha ignorância. Segue o código: criei uma classe limitador:

[code]import javax.swing.;
import javax.swing.text.
;

public class Limitador extends PlainDocument
{

private int iMaxLength;
private Object s;

public Limitador(int maxlen) {
super();
iMaxLength = maxlen;
}

public void insertString(int offset, String str, AttributeSet attr)
throws BadLocationException {
if (s == null) return;

 if (iMaxLength <= 0)        // aceitara qualquer no. de caracteres
 {
     super.insertString(offset, str, attr);
     return;
 }

 int ilen = (getLength() + str.length());
 if (ilen <= iMaxLength)    // se o comprimento final for menor...
     super.insertString(offset, str, attr);   // ...aceita str
 else
 {
     if (getLength() == iMaxLength) return; // nada a fazer
     String newStr = str.substring(0, (iMaxLength - getLength()));

     super.insertString(offset, newStr, attr);
 }
 }

}[/code]

Depois usei esta classe no programa:

[code]
private JTextArea getJTextArea_Pergunta() {
if (jTextArea_Pergunta == null) {

	 jTextArea_Pergunta = new JTextArea();
	 jTextArea_Pergunta.setBounds(new Rectangle(151, 100, 170, 20));
	 jTextArea_Pergunta.setPreferredSize(new Dimension(0, 16));

	jTextArea_Pergunta.setDocument(new Limitador(10));
				

	 //jTextArea_Pergunta.setText("");
	}
	return jTextArea_Pergunta;
}[/code]

Vcs podem me ajudar?

Valeu.

ABS

Essa aqui me foi dado por um usuario do GUJ, é de JTextField, mas pode te ajudar

[code]import javax.swing.JTextField;
import java.awt.event.*;

public class LimitedTextField extends JTextField{
private byte maxLength=0;

public LimitedTextField(int maxLength){
	super();
	this.maxLength = (byte)maxLength;
	this.addKeyListener(new LimitedKeyListener());
}

public void setMaxLength(int maxLength){
	this.maxLength= (byte)maxLength;
	update();
}

private void update(){
	if (getText().length()>maxLength){
		setText(getText().substring(0,maxLength));
		setCaretPosition(maxLength);
	}
}

public void setText(String arg0){
	super.setText(arg0);
	update();
}

public void paste(){
	super.paste();
	update();
}

//Classes Internas
private class LimitedKeyListener extends KeyAdapter{
	private boolean backspace= false;
	
	public void keyPressed(KeyEvent e){
		backspace=(e.getKeyCode()==8);
	}
	
	public void keyTyped(KeyEvent e){
		if (	!backspace	&&
				getText().length()>maxLength-1){
			e.consume();
		}
	}
}

}[/code]

Bom dia.

Então kra, esse código não funcionou, está com erro. Vc acredita que até agora não consegui limitar o numero de caracteres de um textarea?

Se vc tiver mais algum exemplo, eu agradeço.

Abs.

Foi só seguir o tutorial…
Segue anexo o exemplo…

Vini,

Funcionou perfeitamente.

Valeu Kra, te devo essa.

Abraços.

Bom, com erro o código não está, se vc jogá-lo dentro de uma classe ele não vai dar nenhum erro de compilação…

para chama-lo vc faz assim

LimitedTextField campo = new LimitedTextField(10)//10 é um int qualquer

e funciona.

Para TextArea muda o nome, o extends e o construtor q deve funcionar, é só se basear no construtor da própria JTextArea.

Ai pra chamar faz assim

LimitedTextArea area = new LimitedTextArea(int, int, int);

por favor como eu chamo eu instancio esse classe no JFrame meu, em qual evento???

OBS: Não estou criando o jframe dinamico, estou usando a interface do netbeans, os componentes ja estao todos la. Eu quero fazer com que a classe seja setada para os componentes.
Ja tentei de tudo e nao to conseguindo, nao acontece nada.

Começando em java agora, com vontade de continuar mas ta dificil…

[quote=ViniGodoy]Foi só seguir o tutorial…
Segue anexo o exemplo…[/quote]

Olá,

Quando precisei limitar a quantidade de caracteres, utilizei jFormattedTextField e maskFormatter.
Talvez seja meio gambiarra, mas ao menos foi bem simples. :wink:

Exemplo, máximo 30 caracteres:

private void jFormattedTextField1FocusGained(java.awt.event.FocusEvent evt) {
    MaskFormatter mask = new MaskFormatter();

    try {
        mask.setMask("******************************");
        mask.install(jFormattedTextField1);
    } catch (ParseException ex) {
        Logger.getLogger(CadastroPessoa.class.getName()).log(Level.SEVERE, null, ex);
    }

}

Att.,