Возникают проблемы с очисткой текстового поля при вводе неправильного символа - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь извлечь значения из JTextField при нажатии клавиши, чтобы сделать что-то, если значения являются целыми числами, и очистить поле, если значения не являются целыми числами. Каждый раз, когда я пытаюсь получить значение, я получаю значение, введенное до этого (если я ввожу 12, я получаю 1, затем, если я ввожу 123, я получаю 12 назад), и когда я пытаюсь очистить поле от недопустимого символа, все, кроменеверный символ очищается?

public void setUpListeners()
{
    JTextField jT [] = myV.getTextFields();

    jT[0].addKeyListener(new KeyAdapter(){ 
        public void keyTyped(KeyEvent e){
            int id = e.getID();

            if (id == KeyEvent.KEY_TYPED) 
            {
                char c = e.getKeyChar();
                try
                {
                    //check if chars entered are numbers
                    int temp = Integer.parseInt(String.valueOf(c));
                    String tempS = jT[0].getText();
                    System.out.println(tempS);
                }
                catch(Exception ex)
                {
                    jT[0].setText("");
                    System.out.println("Not an integer");

                }
            }
        }
   });
 }

Ответы [ 2 ]

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

Swing компоненты используют Model-View-Controller (MVC) [программное обеспечение] шаблон проектирования / архитектура. Модель содержит данные. Для JTextField данные - это текст, который он отображает. Модель по умолчанию для JTextField - PlainDocument , однако код JTextField фактически ссылается на интерфейс Document, который реализует PlainDocument.

Посмотрите на код для метода getText()в классе JTextComponent (который является суперклассом для JTextField), и вы увидите, что он извлекает текст из Document.

Когда вы вводите ключ в JTextField, символ передаетсядо Document. Может показаться, что ваш keyTyped() метод вызывается до того, как набранный вами символ достигнет Document, следовательно, когда вы вызываете getText() в своем методе keyTyped(), вы получаете весь текст отдельноот последнего введенного вами символа.

Это одна из причин , а не , чтобы использовать KeyListener для проверки текста, введенного в JTextField. Правильный способ подробно описан в вопросе, который tenorsax предоставил ссылку в своем комментарии к вашему вопросу.

Кроме DocumentFilter или JFormattedTextField (или даже InputVerifier ), вы можете добавить и ActionListener к JTextField, которые будут выполняться при нажатии Введите в JTextField. Вы найдете много примеров того, как реализовать каждый из этих параметров, в том числе ссылку, приведенную в комментарии tenorsax .

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

Вы можете сделать следующее:

public static boolean validateNumber(char num){
    return (num >= '0' && num <='9');
}

И затем использовать параметр KeyEvent "e":

if(!validateNumber(e.getKeyChar()))
    e.consume();

И вместо использования

public void keyTyped(KeyEvent e){

использовать

public void keyReleased(KeyEvent e){

Я думаю, вы получите то, что вам нужно, я надеюсь, что помог вам;)

...