[Resolvido] Limitar caracteres JTextArea

5 respostas
yfalbino

olá pessoal,

estou usando NetBeans 7.3 e estou tentando limitar o numero de caracteres de um jTextArea, estou usando a classe:

import javax.swing.text.*;

public class FixedLengthDocument extends PlainDocument
{
    private int iMaxLength;

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

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

        if (iMaxLength <= 0)
        {
            super.insertString(offset, str, attr);
            return;
        }

        int ilen = (getLength() + str.length());
        if (ilen <= iMaxLength)
            super.insertString(offset, str, attr);
        else
        {
            if (getLength() == iMaxLength)
                return;
            String newStr = str.substring(0, (iMaxLength - getLength()));

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

e estou chamando desta forma:

TextMensagem.setDocument(new FixedLengthDocument(200));

porem ele sublinha o [color=blue]new[/color] FixedLengthDocument(200) em vermelho indicando erro
e pede para converter o metodo em Document, e quando eu converto, da o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException: Not supported yet.
	at Projetos.FixedLengthDocument.<init>(FixedLengthDocument.java:14)
	at Projetos.ControleDeEstoque.<init>(ControleDeEstoque.java:91)
	at Projetos.LoginControleDeEstoque.Logar(LoginControleDeEstoque.java:208)
	at Projetos.LoginControleDeEstoque$5.keyPressed(LoginControleDeEstoque.java:190)
	at java.awt.Component.processKeyEvent(Component.java:6463)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2829)
	at java.awt.Component.processEvent(Component.java:6282)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:762)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1027)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:899)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:727)
	at java.awt.Component.dispatchEventImpl(Component.java:4731)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:688)
	at java.awt.EventQueue$3.run(EventQueue.java:686)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:702)
	at java.awt.EventQueue$4.run(EventQueue.java:700)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

alguem sabe qual o problema ?

agradeço desde já

5 Respostas

yfalbino

consegui tirar o erro

porem quando eu digito alguma coisa no jTextArea não aparece nada

pedrofurst

ve se ajuda -> http://www.guj.com.br/articles/29

abraços

yfalbino

ja vi este artigo, obrigado

mas quando eu digito nao aparece nada no jTextArea

pedrofurst
yfalbino:
ja vi este artigo, obrigado

mas quando eu digito nao aparece nada no jTextArea

hmm, fiz uns testes aqui e deu certo. Acho que vc está com o size da tela menor que o JTextArea que está criando.

Eu apenas segui o exemplo do artigo.

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class FixedLengthDocument extends PlainDocument {
    private final int iMaxLength;

    public FixedLengthDocument(final int maxlen) {
        super();
        this.iMaxLength = maxlen;
    }

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

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

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

            super.insertString(offset, newStr, attr);
        }
    }
}
Classe teste, Obs: está limitando para 5 caracteres.
/* Teste.java */

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class Teste {
    public static void main(final String[] args) {
        final JFrame f = new TesteFrame();
        f.setVisible(true);
    }
}

class TesteFrame extends JFrame {
    private final JTextArea txtExemplo;

    public TesteFrame() {
        this.setTitle("Exemplo");
        this.setSize(230, 200);

        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(final WindowEvent e) {
                System.exit(0);
            }
        }); // nao por nada, mas adoro classes internas...

        /* o codigo que interessa esta abaixo */
        this.txtExemplo = new JTextArea(10, 15); 

        this.txtExemplo.setDocument(new FixedLengthDocument(5));
        /* isso, agora sim, teremos um JTextField que aceitará
           no máximo 5 caracteres
        */

        this.getContentPane().add(this.txtExemplo, "South");
    }
}

espero ter ajudado.
Bons estudos

yfalbino

muito Obrigado, ajudou sim

no artigo, esta linha estava errada:

if (s == null)

eu so troquei o ‘s’ por ‘str’ e funcionou perfeitamente

ai ficou assim:

if (str == null)
Criado 28 de maio de 2013
Ultima resposta 29 de mai. de 2013
Respostas 5
Participantes 2