Обеспечить максимальное количество символов в 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 символов? Я'Я смотрел на это все утро и вырывал волосы.Самое главноеКак реализовать мое требование для обработки групповых команд для выделенного текста? Как передать выделение текста внутри текстовой области, прослушать изменения выделенного текста (например, удалить несколько выделенных символов с помощью кнопки возврата и т. Д.) И правильно рассчитать новое значение для оставшихся символов?

Заранее спасибо.

Ответы на вопрос(3)

Ваш ответ на вопрос