Appliquer max caractères sur Swing JTextArea avec quelques balles courbes

Je suis en train d'ajouter des fonctionnalités à un Swing JLabel et JTextArea tels que:

  • L'utilisateur est seulement autorisé à entrer dans 500 caractères dans le textarea (max)
  • L'étiquette contient une chaîne de message indiquant à l'utilisateur le nombre de caractères qu'ils ont laissé (après chaque pression de touche ou la touche retour arrière)
  • Lorsque les composants initialiser l'étiquette indique "500 caractères maximum!"
  • Pour les 500 premiers caractères tapés, pour chaque frappe de touche (a - z, A - Z, 0 - 9, et de la ponctuation) tapé, l'étiquette indique "x caractères restants", où x est le nombre de caractères qu'ils ont quitté avant d'atteindre le max de 500
  • Lors de la 500e caractère est tapé, l'étiquette indique "0 caractères restants", et pas d'autres caractères peuvent être saisis dans la zone de texte
  • Si l'utilisateur tape la touche retour arrière (KeyEvent.VK_BACK_SPACE), se "libérer" d'un personnage, et le comte incréments. Donc si ils avaient 400 caractères restants, et ils le type de retour, le label se lit maintenant "401 caractères restants"
  • Si l'utilisateur met en évidence un ensemble de caractères et effectue une commande en vrac sur eux (comme un retour, ou de remplacer le texte mis en surbrillance avec un seul caractère), le bon nombre de caractères restants seront calculés correctement et que le label sera mis à jour. Donc, si ils ont 50 caractères restants, et ils mettent en évidence 5 lettres et frapper la touche retour arrière, ils ont maintenant "55 caractères restants"

J'ai 90% de cette fonctionnalité de travail, mais ont quelques bugs, et n'avons aucune idée de la façon de mettre en œuvre le dernier point ci-dessus (en gros des commandes sur le texte en surbrillance). Voici ce que j'ai:

boolean ignoreInput = false;
int charMax = 500;
JLabel charCntLabel = getLabel();
JTextArea myTextArea = getTextArea();
myTextArea.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
return;
}
@Override
public void keyReleased(KeyEvent e) {
//If we should be ignoring input then set make sure we
//enforce max character count and remove the newly typed key.
if(ignoreInput)
myTextArea.setText(myTextArea.getText().substring(0,
myTextArea.getText().length()));
}
@Override
public void keyPressed(KeyEvent e) {
String charsRemaining = " characters remaining";
int newLen = 0;
//The key has just been pressed so Swing hasn't updated
//the text area with the new KeyEvent.
int currLen = myTextArea.getText().length();
//Adjust newLen depending on whether the user just pressed
//the backspace key or not.
if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
newLen = currLen - 1;
ignoreInput = false;
}
else
newLen = currLen + 1;
if(newLen < 0)
newLen = 0;
if(newLen == 0)
charCntLabel.setText(charMax + " characters maximum!");
else if(newLen >= 0 && newLen < charMax)
charCntLabel.setText((charMax - newLen) + charsRemaining);
else if(newLen >= charMax) {
ignoreInput = true;
charCntLabel.setText("0 " + charsRemaining);
}
}
});

Le code ci-dessus fonctionne très bien, mais a quelques bugs:

  • Il n'empêche pas l'utilisateur de taper dans > 500 caractères. Lorsque l'utilisateur tape dans le 500e caractère, l'étiquette indique "0 caractères restants." Mais vous pouvez continuer à taper les caractères de suite, et l'étiquette reste le même.
  • Si vous avez > 500 caractères dans le textarea, et vous commencez à reculer, vous verrez chaque personnage étant retiré de la textarea (le modèle sous-jacent), mais l'étiquette reste le même. Mais, une fois que vous backspace assez pour obtenir le 500e personnage, et vous revenir en arrière, le label va commencer à changer correctement, vous dites que vous avez "1 caractères restants", "2 caractères restants", etc. Alors...
  • Ce code semble fonctionner, mais seulement des arrêts de travail > 500 caractères. Une fois que vous obtenez de retour à l'intérieur qu'à 500 max char, il commence à travailler à nouveau.

Les questions

  1. Est-il un moyen plus simple à mettre en œuvre cette fonctionnalité désirée (et pour un Swing JTextArea)? J'ai l'impression de réinventer la roue, ici, et qu'il pourrait y avoir un "nettoyeur" manière d'appliquer de caractères maximums et la mise à jour de leurs labels respectifs.
  2. Si non, quelqu'un peut tache mon > 500 char bug? J'ai regardé ce matin et suis en tirant mes cheveux.
  3. Le plus important, comment puis-je mettre en œuvre mon exigence pour gérer les commandes en vrac pour le texte mis en évidence? Comment puis-je la main les sélections de texte à l'intérieur de la textarea, écouter pour que les modifications au texte mis en surbrillance (par exemple, la suppression de plusieurs caractères en surbrillance avec la touche retour arrière, etc.), et de calculer correctement la nouvelle valeur pour les caractères restants?

Merci d'avance.

  • Vous sont en fait assez compliqué pour vous-même. Ne comptez pas les caractères tapés, simple de vérifier combien de caractères il y a dans le JTextArea en utilisant (par exemple) getText(). Limiter la quantité qui peut être saisie est un autre problème qui peut être résolu en fournissant votre propre document (modèle) pour le JTextArea.
InformationsquelleAutor IAmYourFaja | 2012-12-13