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
- 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.
- Si non, quelqu'un peut tache mon > 500 char bug? J'ai regardé ce matin et suis en tirant mes cheveux.
- 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.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez limiter la taille maximale à l'aide d'un DocumentFilter, cochez cette section documentation, il a un exemple de travail de ce que vous avez besoin.
Prendre cela comme un exemple, j'ai utilisé le composant à partir du fichier de l'exemple ci-dessus:
DocumentSizeFilter
à partir de ces liens. Savez-vous ce que la bibliothèque j'ai besoin de l'ajouter? Merci encore!evt.consommer(); aidera beaucoup dans ce cas..vous n'avez pas besoin d'utiliser DocumentFilter. voici un moyen beaucoup plus facile de limiter l'utilisateur à certains de longueur
À ajouter sur ce que Ray S. Kan a dit:
Il y a un moyen plus facile de limite de caractères pour un JTextArea sans avoir à utiliser un DocumentFilter comme indiqué par Ray S. Kan, mais la question avec sa réponse est qu'il n'a pas empêcher quelqu'un de le copier-coller d'un texte long. La suivante va empêcher un utilisateur de coller des trucs pour contourner la limite de:
Cela va s'arrêter sur une touche soit pressée si la longueur n'est pas pass max, mais si il passe à max, il va tout simplement remplacer la chaîne de caractères dans la zone de texte avec une courte chaîne. Le
text
variable est le JTextArea swing objet.