I'm trying to get text from a text field but every time I run the program I get a NullPointerException. Similar problems I've found on the internet involve the text field being redeclared as a local variable, but I can't see that I am doing that here.
The error is :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at the line specified. Any help would be much appreciated
EDIT:
This short program demonstrates the problem
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Test{
public static final Test application = new Test();
private JFrame jFrame = null;
private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null,
defaultPanel = null;
private JPanel[] mainPanel = {getDefaultPanel(), getManualPanel(), getUploadPanel()};
private JButton manualButton = null, uploadButton = null, manualAssignButton = null;
private JTextField manualEntryField = null;
private JLabel manualLabel = null;
final static String DEFAULTPANEL = "Default";
final static String MANUALPANEL = "Manual";
final static String UPLOADPANEL = "Upload";
/**
* Main method
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
application.getJFrame().setVisible(true);
}
});
}
/**
* Get the main application frame
* @return JFrame
*/
private JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
jFrame.setResizable(false);
// Add the main content pane
jFrame.setContentPane(getJContentPanel());
jFrame.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
closeApplication();
}
});
}
jFrame.pack();
jFrame.setLocationRelativeTo(null);
return jFrame;
}
/**
* Get main content
* @return JPanel
*/
private JPanel getJContentPanel(){
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setPreferredSize(new Dimension(500, 200));
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getButtonsPanel(), BorderLayout.NORTH);
jContentPane.add(getCardPanel(), BorderLayout.CENTER);
}
return jContentPane;
}
private JPanel getButtonsPanel() {
if(buttonsPanel == null){
buttonsPanel = new JPanel();
buttonsPanel.setPreferredSize(new Dimension(500, 50));
buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
manualButton = new JButton("Enter manually");
manualButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)(cardPanel.getLayout());
cl.show(cardPanel, MANUALPANEL);
}
});
uploadButton = new JButton("Upload file");
uploadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)(cardPanel.getLayout());
cl.show(cardPanel, UPLOADPANEL);
}
});
buttonsPanel.add(manualButton);
buttonsPanel.add(uploadButton);
}
return buttonsPanel;
}
private JPanel getCardPanel() {
if(cardPanel == null){
cardPanel = new JPanel(new CardLayout());
cardPanel.setPreferredSize(new Dimension(500, 200));
cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
cardPanel.add(mainPanel[0], DEFAULTPANEL);
cardPanel.add(mainPanel[1], MANUALPANEL);
cardPanel.add(mainPanel[2], UPLOADPANEL);
}
return cardPanel;
}
private JPanel getDefaultPanel() {
if(defaultPanel == null){
defaultPanel = new JPanel();
}
return defaultPanel;
}
private JPanel getManualPanel() {
if(manualPanel == null){
manualPanel = new JPanel();
manualPanel.setLayout(new FlowLayout());
manualEntryField = new JTextField(10);
manualEntryField.setText("Enter code");
manualAssignButton = new JButton("Assign");
manualAssignButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Here is the exception
System.out.println(manualEntryField.getText().trim());
}
});
manualLabel = new JLabel("Please enter a code and press assign");
manualPanel.add(manualEntryField);
manualPanel.add(manualAssignButton);
manualPanel.add(manualLabel);
}
return manualPanel;
}
private JPanel getUploadPanel() {
if(uploadPanel == null){
uploadPanel = new JPanel();
}
return uploadPanel;
}
private void closeApplication() {
System.exit(0);
}
}
After looking at your SSCCE, I managed to solve the NPE by commenting out the redundant Test that was instantiated, and creating the panel array in the constructor. E.G.
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Test{
//public static final Test application = new Test();
private JFrame jFrame = null;
private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null,
defaultPanel = null;
private JPanel[] mainPanel = new JPanel[3];
private JButton manualButton = null, uploadButton = null, manualAssignButton = null;
private JTextField manualEntryField = null;
private JLabel manualLabel = null;
final static String DEFAULTPANEL = "Default";
final static String MANUALPANEL = "Manual";
final static String UPLOADPANEL = "Upload";
Test() {
mainPanel[0] = getDefaultPanel();
mainPanel[1] = getManualPanel();
mainPanel[2] = getUploadPanel();
}
/**
* Main method
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Test().getJFrame().setVisible(true);
}
});
}
/**
* Get the main application frame
* @return JFrame
*/
private JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
jFrame.setResizable(false);
// Add the main content pane
jFrame.setContentPane(getJContentPanel());
jFrame.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
closeApplication();
}
});
}
jFrame.pack();
jFrame.setLocationRelativeTo(null);
return jFrame;
}
/**
* Get main content
* @return JPanel
*/
private JPanel getJContentPanel(){
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setPreferredSize(new Dimension(500, 200));
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getButtonsPanel(), BorderLayout.NORTH);
jContentPane.add(getCardPanel(), BorderLayout.CENTER);
}
return jContentPane;
}
private JPanel getButtonsPanel() {
if(buttonsPanel == null){
buttonsPanel = new JPanel();
buttonsPanel.setPreferredSize(new Dimension(500, 50));
buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
manualButton = new JButton("Enter manually");
manualButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)(cardPanel.getLayout());
cl.show(cardPanel, MANUALPANEL);
}
});
uploadButton = new JButton("Upload file");
uploadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)(cardPanel.getLayout());
cl.show(cardPanel, UPLOADPANEL);
}
});
buttonsPanel.add(manualButton);
buttonsPanel.add(uploadButton);
}
return buttonsPanel;
}
private JPanel getCardPanel() {
if(cardPanel == null){
cardPanel = new JPanel(new CardLayout());
cardPanel.setPreferredSize(new Dimension(500, 200));
cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
cardPanel.add(mainPanel[0], DEFAULTPANEL);
cardPanel.add(mainPanel[1], MANUALPANEL);
cardPanel.add(mainPanel[2], UPLOADPANEL);
}
return cardPanel;
}
private JPanel getDefaultPanel() {
if(defaultPanel == null){
defaultPanel = new JPanel();
}
return defaultPanel;
}
private JPanel getManualPanel() {
if(manualPanel == null){
manualPanel = new JPanel();
manualPanel.setLayout(new FlowLayout());
manualEntryField = new JTextField(10);
System.out.println("creating text field");
manualEntryField.setText("Enter code");
manualAssignButton = new JButton("Assign");
manualAssignButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Here is the exception
System.out.println(manualEntryField);
System.out.println(manualEntryField.getText());
System.out.println(manualEntryField.getText().trim());
}
});
manualLabel = new JLabel("Please enter a code and press assign");
manualPanel.add(manualEntryField);
manualPanel.add(manualAssignButton);
manualPanel.add(manualLabel);
}
return manualPanel;
}
private JPanel getUploadPanel() {
if(uploadPanel == null){
uploadPanel = new JPanel();
}
return uploadPanel;
}
private void closeApplication() {
System.exit(0);
}
}
Note: I cannot quite explain why the changes solved the NPE, I was just refactoring 'suspicious' code.
I did solved your query related to NullPointerException :
The problem being that you declaring your class variable :
JTextField manualEntryField = null;
Just write :
private JTextField manualEntryField;
Just remove that null thing, against it and the rest of the code is fine. Cannot say as to why it happened, but might be someone else can.
Here is your code with only that change, do try this out now :
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Test{
public static final Test application = new Test();
private JFrame jFrame = null;
private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null, defaultPanel = null;
private JPanel[] mainPanel = {getDefaultPanel(), getManualPanel(), getUploadPanel()};
private JButton manualButton = null, uploadButton = null, manualAssignButton = null;
private JTextField manualEntryField;
private JLabel manualLabel = null;
final static String DEFAULTPANEL = "Default";
final static String MANUALPANEL = "Manual";
final static String UPLOADPANEL = "Upload";
/**
* Main method
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
application.getJFrame().setVisible(true);
}
});
}
/**
* Get the main application frame
* @return JFrame
*/
private JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
jFrame.setResizable(false);
// Add the main content pane
jFrame.setContentPane(getJContentPanel());
jFrame.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
closeApplication();
}
});
}
jFrame.pack();
jFrame.setLocationRelativeTo(null);
return jFrame;
}
/**
* Get main content
* @return JPanel
*/
private JPanel getJContentPanel(){
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setPreferredSize(new Dimension(500, 200));
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getButtonsPanel(), BorderLayout.NORTH);
jContentPane.add(getCardPanel(), BorderLayout.CENTER);
}
return jContentPane;
}
private JPanel getButtonsPanel() {
if(buttonsPanel == null){
buttonsPanel = new JPanel();
buttonsPanel.setPreferredSize(new Dimension(500, 50));
buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
manualButton = new JButton("Enter manually");
manualButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)(cardPanel.getLayout());
cl.show(cardPanel, MANUALPANEL);
}
});
uploadButton = new JButton("Upload file");
uploadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
CardLayout cl = (CardLayout)(cardPanel.getLayout());
cl.show(cardPanel, UPLOADPANEL);
}
});
buttonsPanel.add(manualButton);
buttonsPanel.add(uploadButton);
}
return buttonsPanel;
}
private JPanel getCardPanel() {
if(cardPanel == null){
cardPanel = new JPanel(new CardLayout());
cardPanel.setPreferredSize(new Dimension(500, 200));
cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
cardPanel.add(mainPanel[0], DEFAULTPANEL);
cardPanel.add(mainPanel[1], MANUALPANEL);
cardPanel.add(mainPanel[2], UPLOADPANEL);
}
return cardPanel;
}
private JPanel getDefaultPanel() {
if(defaultPanel == null){
defaultPanel = new JPanel();
}
return defaultPanel;
}
private JPanel getManualPanel() {
if(manualPanel == null){
manualPanel = new JPanel();
manualPanel.setLayout(new FlowLayout());
manualEntryField = new JTextField(10);
manualEntryField.setText("Enter code");
manualAssignButton = new JButton("Assign");
manualAssignButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Here is the exception
System.out.println(manualEntryField.getText().trim());
}
});
manualLabel = new JLabel("Please enter a code and press assign");
manualPanel.add(manualEntryField);
manualPanel.add(manualAssignButton);
manualPanel.add(manualLabel);
}
return manualPanel;
}
private JPanel getUploadPanel() {
if(uploadPanel == null){
uploadPanel = new JPanel();
}
return uploadPanel;
}
private void closeApplication() {
System.exit(0);
}
}
Regards
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With