Limitar quantidade de linhas no JTextArea

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?

Vê se resolve seu problema:

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

Abraços :wink:

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?

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.



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

Só falta colocar sua msg

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:

[code]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);
    }
}

}[/code]

[code]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;
}

}
[/code]

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?