Обеспечить максимальное количество символов в Swing JTextArea с помощью нескольких кривых шаров

Я пытаюсь добавить функциональность в Swing JLabel и JTextArea, чтобы:

Пользователь может только ввести 500 символов в текстовое поле (макс.)Метка содержит строковое сообщение, сообщающее пользователю, сколько символов осталось (после каждого нажатия клавиши или возврата на одну позицию)Когда компоненты инициализируются, надпись гласит «максимум 500 символов!»Для первых 500 введенных символов для каждого введенного нажатия клавиш (a - z, A - Z, 0 - 9 и пунктуации) метка гласит: «осталось x символов», гдеx это число символов, которые они оставили, прежде чем они достигнут максимум 500Когда набирается 500-й символ, метка гласит «осталось 0 символов», и в текстовую область нельзя вводить дополнительные символыЕсли пользователь нажимает кнопку возврата (KeyEvent.VK_BACK_SPACE), они «освобождают» персонажа, и количество увеличивается. Таким образом, если у них осталось 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)

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