Необходимо прочитать ввод двух JTextFields после нажатия кнопки

#java #swing #jtextfield

#java #swing #jtextfield

Вопрос:

Я работаю над программой, которая запускает апплет, который продемонстрирует, как работает расширенный алгоритм Евклида. У меня есть два JTextFields, в которые будут введены значения, и их необходимо прочитать / преобразовать в целые числа и т.д. У меня возникли проблемы с фактическим чтением входных значений для начала.

Обновленный вопрос:
Я внес изменения в свой код после прочтения первого ответа. Вместо использования DocumentListener я делаю все в своем методе actionPerformed, как было предложено, но когда я пытаюсь протестировать, я все еще получаю ошибки.

Это мое текущее выполненное действие:

 public void actionPerformed(ActionEvent event) {
    System.out.println(event.getActionCommand());
    String quotient = "";
    nText = nField.getText();
    mText = mField.getText();

    if("Find GCD".equals(event.getActionCommand())){
        int nInt = Integer.parseInt(nText);
        int mInt = Integer.parseInt(mText);
        int q = mInt/nInt;
        quotient = (Integer.toString(q));
    }
    else quotient = "n/a";
    //NOT the gcd, just to see if this will display
    gcd.setText(quotient);
    gcd.setEditable(false);
}
  

(примечание: gcd — это еще одно JTextField, но оно просто необходимо для отображения результата)

Теперь, после нажатия моей кнопки, я получаю эти ошибки, распечатанные в консоли:

Исключение в потоке «AWT-EventQueue-1» java.lang.Исключение NullPointerException в EuclidApplet.actionPerformed(EuclidApplet.java:87) в javax.swing.AbstractButton.fireactionпереработан (неизвестный источник) в javax.swing.AbstractButton$Handler.actionпереработан (неизвестный источник) в javax.swing.DefaultButtonModel.fireactionпереработан (неизвестный источник) в javax.swing.DefaultButtonModel.setPressed(неизвестный источник) в javax.swing.plaf.basic.BasicButtonListener.mouseReleased(неизвестный источник) в java.awt.Component.processMouseEvent(неизвестный источник) в javax.swing.JComponent.processMouseEvent (неизвестный источник) в java.awt.Component.processEvent (неизвестный источник) в java.awt.Container.processEvent (неизвестный источник) в java.awt.Component.dispatchEventImpl (неизвестный источник) в java.awt.Container.dispatchEventImpl (неизвестный источник) в java.awt.Component.dispatchEvent(неизвестный источник) в java.awt.Component.dispatchEvent(неизвестный источник) в java.awt. LightweightDispatcher.retargetMouseEvent (неизвестный источник) на java.awt.LightweightDispatcher.processMouseEvent (неизвестный источник) на java.awt.LightweightDispatcher.dispatchEvent (неизвестный источник) на java.awt.Container.dispatchEventImpl (неизвестный источник) в java.awt.Window.dispatchEventImpl (неизвестный источник) в java.awt.Component.dispatchEvent (неизвестный источник) в java.awt.EventQueue.dispatchEventImpl (неизвестный источник) в java.awt.EventQueue.доступ к $ 000 (неизвестный источник) в java.awt.EventQueue $ 1.запустить (неизвестный источник) в java.awt.EventQueue $ 1. запустить (неизвестный источник) в java.security.AccessController.Допривилегировано (собственный метод) в java.security.AccessControlContext $ 1.doIntersectionPrivilege(неизвестный источник) в java.security.AccessControlContext $ 1.doIntersectionPrivilege (неизвестный источник) в java.awt.EventQueue$ 2.run (Неизвестный источник) в java.awt.EventQueue $ 2.run (неизвестный источник) в java.security.AccessController.Допривилегировано (собственный метод) в java.security.AccessControlContext$ 1.doIntersectionPrivilege(неизвестный источник) в java.awt.EventQueue.dispatchEvent (неизвестный источник) на java.awt.EventDispatchThread.pumpponeeventforfilters(неизвестный источник) на java.awt.EventDispatchThread.pumpEventsForFilter (неизвестный источник) на java.awt.EventDispatchThread.pumpeventsforchierarchy(неизвестный источник) на java.awt.EventDispatchThread.pumpEvents(неизвестный источник) на java.awt.EventDispatchThread.pumpEvents (неизвестный источник) на java.awt.EventDispatchThread.run (неизвестный источник)

Я получаю исключение NullPointerException в строке, где я установил

 nText = nField.getText();
  

но я все еще не уверен, почему я не могу получить текст, который был вставлен в мое JTextField. Каждый найденный мной пример показывает, что это должно сработать, но я не могу этого сделать. Спасибо.

Комментарии:

1. Почему вы просто не читаете текст в методе actionPerformed, а не просматриваете свертки DocumentListener и все, что с ним связано?

Ответ №1:

Я получаю исключение NullPointerException в строке, где я устанавливаю nText = nField.getText();

Это, вероятно, потому, что вы определили nField как переменную класса и локальную переменную. Проблема в том, что вы пытаетесь ссылаться на переменную класса, которая равна null.

Решение состоит в том, чтобы избавиться от переменной класса.

Ответ №2:

Решение: не используйте DocumentListener, поскольку это не только излишество, но и неправильно. Если вы хотите получить значение при нажатии кнопки, то получите значения в действии кнопки, а не из DocumentListener. Если получение значений из прослушивателя действий кнопки не работает, тогда давайте выясним, что вы делаете неправильно, и поможем вам устранить эту ошибку.

На самом деле, я вижу, что вы пытались сделать это один раз, но прокомментировали это:

 System.out.println(event.getActionCommand());
System.out.println(event.getID());
String quotient = "";
//nText = nField.getText();  // **** here ****
//mText = mField.getText();  // **** and here ****
  

так что раскомментируйте эти строки и избавьтесь от вашего DocumentListener.

Проблема, которую я вижу ниже, заключается в том, что вы пытаетесь проверить, эквивалентны ли строки, используя оператор ==:

 if("Find GCD" == event.getActionCommand()){
    int nInt = Integer.parseInt(nText);
    int mInt = Integer.parseInt(mText);
    int q = mInt/nInt;
    quotient = (Integer.toString(q));
}
  

Не делайте этого, так как иногда это может сработать, а в другое время дать сбой. На самом деле вас не волнует, являются ли две строки одним и тем же объектом (что и проверяет оператор ==), скорее вы хотите знать, содержат ли они одинаковые строковые данные. Для этого вам следует использовать метод equals или equalsIgnoreCase:

 if ("Find GCD".equals(event.getActionCommand())) {
    int nInt = Integer.parseInt(nText);
    int mInt = Integer.parseInt(mText);
    int q = mInt/nInt;
    quotient = (Integer.toString(q));
}
  

Комментарии:

1. Потрясающее спасибо! Не могу поверить, что я использовал == вместо .equals, я знаю лучше, чем это. Я попробую это и посмотрю, как это получится. еще раз спасибо!