Обеспечить максимальное количество символов в Swing JTextArea с помощью нескольких кривых шаров
я пытаюсь добавить функциональность в Swing JLabel и JTextArea, чтобы:
Пользователь может только ввести 500 символов в текстовое поле (макс.)Метка содержит строковое сообщение, сообщающее пользователю, сколько символов осталось (после каждого нажатия клавиши или возврата на одну позицию)Когда компоненты инициализируются, надпись гласит:Максимум 500 символов!Для первых 500 введенных символов, для каждого набранного нажатия клавиш (a - z, A - Z, 0 - 9 и пунктуация) метка гласит:х символов осталось ", гдеx
это число символов, которые они оставили, прежде чем они достигнут максимум 500Когда набирается 500-ый символ, надпись гласит:Осталось 0 символови никакие другие символы не могут быть введены в текстовую областьЕсли пользователь нажимает кнопку возврата (KeyEvent.VK_BACK_SPACE
), Oни "свободно" до символа, и счетчик увеличивается. Таким образом, если у них осталось 400 символов и они набирают клавишу Backspace, метка теперь гласит:Осталось 401 символовЕсли пользователь выделяет набор символов и выполняет с ними массовую команду (например, возврат на одну позицию или замену выделенного текста одним символом), правильное число оставшихся символов будет вычислено правильно, а метка будет обновлена. Так что, если у них осталось 50 символов, и они выделили 5 букв и нажали клавишу Backspace, они теперь имеют "Осталось 55 символовУ меня 90% этой функциональности работает, но у меня есть несколько ошибок, и я понятия не имею, как реализовать последний элемент выше (групповые команды для выделенного текста). Вот'Что у меня есть:
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);
}
}
});
Приведенный выше код работает довольно хорошо, но имеет несколько ошибок:
Это нене позволяет пользователю вводить> 500 символов. Когда пользователь вводит 500-й символ, надпись гласит:Осталось 0 символов. " Но вы можете продолжать вводить символы после этого, и метка остается прежней.Если у вас есть> 500 символов в текстовой области, и вы начинаете отступать, выВы увидите, как каждый символ удаляется из текстовой области (базовой модели), но метка остается прежней.Но, как только вы заберете достаточно, чтобы добраться до 500-го символа, и вы вернетесь назад, метка начнет правильно меняться, сообщая вам, что у вас есть "1 символов осталось ","Осталось 2 символаи т. д. Итак ...Этот код, кажется, работает, но просто перестает работать> 500 символов. Как только вы вернетесь в этот максимум 500 символов, он снова начнет работать.ВопросыЕсть ли более простой способ реализовать эту желаемую функциональность (и для Swing JTextArea)? Я чувствую, что яя изобретаю колесо здесь и что там может быть "очиститель" способ применения максимумов символов и обновления их соответствующих меток.Если нет, кто-нибудь может заметить мой> Ошибка 500 символов? Я'Я смотрел на это все утро и вырывал волосы.Самое главноеКак реализовать мое требование для обработки групповых команд для выделенного текста? Как передать выделение текста внутри текстовой области, прослушать изменения выделенного текста (например, удалить несколько выделенных символов с помощью кнопки возврата и т. Д.) И правильно рассчитать новое значение для оставшихся символов?Заранее спасибо.