Создание текстового поля, которое принимает только один целочисленный ввод - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь создать метод, который позволяет мне вводить только одно число в текстовое поле, однако мой текущий код не работает. Это позволяет мне печатать буквы, даже если метод KeyPressed активирован. Однако работает код, ограничивающий ввод только 1 символом.

void formatTextField(JTextField field)
{
    field.addKeyListener(new KeyAdapter()
    {
        public void keyTyped(KeyEvent e)
        { 
            if (field.getText().length() >= 1)
            {
                e.consume();
            }
        }
        public void keyPressed(KeyEvent e)
        {               
            try
            {
                String keyText = KeyEvent.getKeyText(e.getKeyCode());
                Integer.parseInt(keyText);
            }
            catch(NumberFormatException | NullPointerException ex)
            {
                e.consume();
            }
        }
    });
}

Ответы [ 2 ]

2 голосов
/ 13 октября 2019

Было бы лучше, если бы вы использовали уже существующее решение для таких случаев. Вы можете использовать JFormattedTextField или JSpinner . Нет необходимости тратить время / усилия на создание KeyListeners или какого-либо фильтра.

Плюс JSpinner более удобен для пользователя, так как пользователь может распознать, что это поле принимает только цифры.

Если вы настаиваете на использовании JTextField, я предлагаю вам воспользоваться подходом DocumentFilter , который в основном описан в этого вопроса.

0 голосов
/ 13 октября 2019

После того, как я поэкспериментировал с этим, я обнаружил, что использование keyPressed не является правильным методом, так как он ничего не возвращает для кода ключа. Использование keyChar в методе keyTyped является гораздо лучшим подходом. Я разместил код здесь на тот случай, если кто-нибудь найдет его полезным.

Как сказал Джордж З. в своем ответе, вероятно, было бы лучше использовать JSpinner или JFormattedTextField , однако, если вы хотите использовать текстовое поле, код ниже будет работать.

void formatTextField(JTextField field)
{
    field.addKeyListener(new KeyAdapter()
    {
        public void keyTyped(KeyEvent e)
        {
            if (field.getText().length() >= 1)
            {
                e.consume();
            }
            try
            {
                Integer.parseInt(String.valueOf(e.getKeyChar()));
            }
            catch(NumberFormatException | NullPointerException ex)
            {
                e.consume();
            }
        }
    });
}
...