Limitar quantidade de linhas no JTextArea

5 respostas
S

Galera,

Como faço para limitar a quantidade de linhas de um JTextArea?

Exemplo:

Eu quero limitar para que o jTextArea teha no máximo 50 linhas. Se o usuário tentar iniciar a linha 51 pretendo emitir um aviso de que chegou ao máximo.

Tentei usar os métodos setLineWrap(true) em conjunto com o getLineCount() mas não estou tendo sucesso.

Alguma dica?

5 Respostas

adriano_si

Vê se resolve seu problema:

http://stackoverflow.com/questions/12160060/how-to-limit-number-of-lines-in-jtextarea

Abraços :wink:

S

Oi Adriano,

Obrigado pela resposta.

Não deu muito certo não, quando chega no limite máximo que eu estipulo ele “apaga” o que estava no jTextArea e recomeça.

Seria isso mesmo?

S

O método setLineWrap(boolean) quebra apenas visualmente a linha? Não quebra a String?

Alguma dica de como quebrar a String sempre que chegar ao final da linha?

obrigado.

alexfe
private JTextArea textNorma = new JTextArea(new TTextAreaDocument(50));



//=================================================================
package jalis.util;

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

/**
 * Classe para controle da quantidade de caracteres a serem digitados em <code>TextArea</code>
 * @author junior
 */
public class TTextAreaDocument extends PlainDocument{
  private int maxLength = 0;
  private boolean isUpperCase = false;

  /**
   * Define a quantidade máxima de caracteres a serem digitados
   * @param length int
   */
  public TTextAreaDocument(int length) {
    super();
    maxLength = length;
  }

  /**
   * Define o documento para ser digitado apenas em uppercase
   * @param upper boolean
   */
  public void setUpperCase(boolean upper) {
    isUpperCase = upper;
  }

  /**
   * Controla a entrada e a quantidade de caracteres
   * @param offs int
   * @param str String
   * @param a AttributeSet
   * @throws BadLocationException
   */
  public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
    if (str != null) {
      int qtdeFinal = getLength() + str.length();

      if (maxLength == 0 || qtdeFinal <= maxLength)
        super.insertString(offs, (isUpperCase? str.toUpperCase(): str), a);
      else
      if (qtdeFinal > maxLength) {
        String nova = str.substring(0, maxLength - getLength());
        super.insertString(offs, (isUpperCase? nova.toUpperCase(): nova), a);
      }
    }
  }
}

 falta colocar sua msg
S

Opa alexafe,

Obrigado pela resposta. Estava dando uma testada no código que você postou e percebi que ele limita a quantidade de caracteres do JTextArea.

Até achei uma alternativa para limitar a quantidade de linhas:

public class LimitedLinesDocument extends DefaultStyledDocument {

    private static final String EOL = "\n";

    private int maxLines;

    public LimitedLinesDocument(int maxLines) {
        this.maxLines = maxLines;
    }

    public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException {
        if (!EOL.equals(str) || StringUtils.occurs(getText(0, getLength()), EOL) < maxLines - 1) {
            super.insertString(offs, str, attribute);
        }
    }
}
public class StringUtils {

    public static int occurs(String str, String subStr) {
        int occurrences = 0;
        int fromIndex = 0;

        while (fromIndex > -1) {
            fromIndex = str.indexOf(subStr, occurrences == 0 ? fromIndex : fromIndex + subStr.length());
            if (fromIndex > -1) {
                occurrences++;
            }
        }

        return occurrences;
    }

}

Diante disso, me deparei com um segundo problema:

O LineWrap quebra a linha apenas visualmente no JtextArea, se o usuário escrever um parágrafo muito grande, que visualmente ocupe 5 linhas do JTextArea, ao exportar esse texto eu recebo apenas como uma única linha.

Eu preciso receber as 5 linhas, no formato identico que está apresentado na GUI para o usuário.

Será que tem como?

Criado 5 de janeiro de 2015
Ultima resposta 8 de jan. de 2015
Respostas 5
Participantes 3