Comment limiter JTextArea max de Lignes et de Colonnes?

Je suis en utilisant JTextArea dans JScrollPane

Je veux limiter le nombre de lignes maximum possible et le maximum de caractères dans chaque ligne.

J'ai besoin que la chaîne sera exactement comme sur l'écran, chaque ligne se termine avec '\n' (si il y a une autre ligne après lui), et l'utilisateur sera en mesure d'insérer seulement X lignes et Y les caractères de chaque ligne.

J'ai essayé de limiter les lignes mais je ne sais pas exactement combien de lignes ce que je dois à cause de la ligne d'emballage, Le retour à la ligne est le démarrage de la nouvelle ligne visuellement sur l'écran(à cause de la largeur de la JTextArea), mais dans la chaîne de la composante est-elle la même ligne avec pas de '\n' pour indiquer la ligne nouvelle. Je n'ai pas une idée de la façon de limiter au max les caractères de chaque ligne lors de la frappe.

Il y a 2 étapes:

  1. La saisie de la chaîne - garder que l'utilisateur ne sera pas en mesure de taper plus de X lignes et Y les caractères de chaque ligne. (même si le wrap ligne seulement visuellement ou que l'utilisateur a tapé '/n')
  2. Insérer la chaîne de la DB - après en cliquant " OK " convertir la chaîne de caractères que chaque ligne se termine par "/n", même si l'utilisateur n'a pas tapé à la machine et de la ligne a été enveloppé seulement visuellement.

Il y a peu de problèmes si je vais compter les caractères dans la ligne et insérez '/n' à la fin de la ligne, c'est pourquoi j'ai décidé de le faire en deux étapes. Dans la première étape ehile l'utilisateur tape je préfère que vous limiter visuellement et ligne de force wrpping ou quelque chose de similaire. Seulement dans la deuxième étape, lorsque je sauvegarde chaîne je vais ajouter l' '/n', même si l'utilisateur n'a pas tapé dans la fin de la lignes de!

Quelqu'un a une idée?


Je sais que je vais avoir à utiliser DocumentFilter OU StyledDocument.

Voici un exemple de code qui limite les lignes à 3:(mais pas les caractères dans la ligne pour 19)

private JTextArea textArea ;
textArea  = new JTextArea(3,19);
textArea  .setLineWrap(true);
textArea .setDocument(new LimitedStyledDocument(3));
JScrollPane scrollPane  = new JScrollPane(textArea

public class LimitedStyledDocument extends DefaultStyledDocument

    /** Field maxCharacters */
    int maxLines;

    public LimitedStyledDocument(int maxLines) {
        maxCharacters = maxLines;
    }

public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException {
    Element root = this.getDefaultRootElement();
    int lineCount = getLineCount(str);

    if (lineCount + root.getElementCount() <= maxLines){
        super.insertString(offs, str, attribute);
    }
    else {
        Toolkit.getDefaultToolkit().beep();
    }
}

 /**
 * get Line Count
 * 
 * @param str
 * @return the count of '\n' in the String
 */
private int getLineCount(String str){
    String tempStr = new String(str);
    int index;
    int lineCount = 0;

    while (tempStr.length() > 0){
        index = tempStr.indexOf("\n");
        if(index != -1){
        lineCount++;
            tempStr = tempStr.substring(index+1);
        }
    else{
        break;
        }
    }
    return lineCount;
   }
}
Pas une réponse, mais vous êtes probablement mieux de document à l'aide de filtres.

OriginalL'auteur Billbo bug | 2009-01-26