2014-11-22 2 views
0

Когда программа пытается получить текст из текстовых полей (в actionPreformed()), я получаю ошибку java.lang.NullPointerException, даже если в текстовом поле есть текст.getText from textfields возвращает null

Ошибка возникает только при нажатии кнопки «Ввод». Все, что мне нужно, это получить целочисленные значения от пользователя, используя текстовые поля, когда нажата кнопка ввода.

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class Main extends JFrame implements ActionListener { 

    private JTextField textField1, textField2, time; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Clock"); 
     frame.setSize(600, 600); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel p = new JPanel(); 
     JPanel p2 = new JPanel(); 
     JPanel p3 = new JPanel(); 
     JPanel p4 = new JPanel(); 

     JTextField textField1 = new JTextField(10); 

     JTextField textField2 = new JTextField(10); 

     JLabel label = new JLabel("Enter the Time"); 

     p.add(label); 

     p.add(textField1); 

     p.add(textField2); 

     JButton button = new JButton("Enter"); 

     button.addActionListener(new Main()); 

     p2.add(button); 

     JTextField time = new JTextField(); 
     time.setEditable(false); 

     p3.add(time); 

     frame.add(p, BorderLayout.PAGE_START); 
     frame.add(p2, BorderLayout.PAGE_END); 
     frame.add(p3, BorderLayout.CENTER); 

     frame.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 

     if(e.getActionCommand().equals("Enter")){ 

      int int1 = Integer.parseInt(textField1.getText()); 
      int int2 = Integer.parseInt(textField2.getText()); 

      System.out.println(int1); 
      System.out.println(int2); 
     } 

     System.out.println("Pressed"); 
    } 

} 

Как это сделать?

ответ

0

Выполненное действие, я считаю, должно быть в addactionlistener кнопки. Это действует как нечто, называемое анонимным классом, который имеет свой собственный набор функций. Текстовые поля, хотя должны быть установлены как final, которые будут использоваться в функции анонимного класса.

final JTextField textField1 = new JTextField(10); 

final JTextField textField2 = new JTextField(10); 

button.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 

     if(e.getActionCommand().equals("Enter")){ 

      int int1 = Integer.parseInt(textField1.getText()); 
      int int2 = Integer.parseInt(textField2.getText()); 

      System.out.println(int1); 
      System.out.println(int2); 
     } 

     System.out.println("Pressed"); 


    } 
}); 
0

Эти строки скрывают класс полей одного и того же имени, и они используются в слушателя, - но они не являются теми, которые добавляются в иерархии виджетов. Следовательно, NPE.

JTextField textField1 = new JTextField(10); 
JTextField textField2 = new JTextField(10); 

Теперь вы не можете ссылаться на поля класса в основном статическом методе. Это всегда плохая идея использовать main для любой конкретной работы приложения. Удалите код из main, поместите его в настоящий метод Main, давайте назовем его build(). Создайте один (!) Объект в главном, вызовите build() оттуда, удалите имена классов из указанных выше двух строк и установите прослушиватель с помощью this - не создавайте другого основного объекта!

Смежные вопросы