JTextArea - Limitar nº caracteres

13 respostas
J

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

Valeu

Abs.

13 Respostas

Romeo

Ja tentou implementar uma action listener com um keyEvent?

J

Ainda não.

Como eu limitaria o JTextArea implementando isso?

ViniGodoy

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.

Romeo

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

ViniGodoy

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.

J
Pessoal, não estou conseguindo, desculpem a minha ignorância. Segue o código: criei uma classe limitador:
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);
     }
     }
}
Depois usei esta classe no programa:
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;
	}

Vcs podem me ajudar?

Valeu.

ABS

Romeo

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

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

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.

ViniGodoy

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

J

Vini,

Funcionou perfeitamente.

Valeu Kra, te devo essa.

Abraços.

Romeo

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);

F

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…

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

R

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.,

Criado 20 de março de 2007
Ultima resposta 1 de out. de 2008
Respostas 13
Participantes 5