0

I am creating a schedule program so that when someone enters in their eight class periods and click the "Enter Classes" button, the user can pick from a JComboBox of schedule names for my school. I have little knowledge of Swing and this is my first Swing project.

My issue: When a user clicks the "Enter Class" button on the content pane, the text entered into the JTextFields is added to an array. After that, I attempt to set the content pane to invisible, add a panel from another class, and set that other panel visible. So far, I keep getting a wall of errors starting with the "AWT Event-Queue-0" NullPointerException.

Main Class: GUIRetry

package Package;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GUIRetry implements ActionListener {

public static void main (String[] args){
    new GUIRetry().GUI();
}

public JFrame         f;
public JButton   button;
public JTextField  zero;
public JTextField   one;
public JTextField   two;
public JTextField three;
public JTextField  four;
public JTextField  five;
public JTextField   six;
public JTextField seven;
public JTextField eight;
public JPanel   content;
public Component spane;
public ScheduleGetterGUI combo;

public String[] classes = new String[9];

public void GUI(){

    f = new JFrame("SchoolHelper");
    f.setSize(275, 600);
    f.setResizable(false);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    content = new JPanel(new GridLayout(10, 2));
    content.setBorder(BorderFactory.createLineBorder(Color.black, 2));

    JLabel enterzero = new JLabel("Enter Zero Period");
    content.add(enterzero);
    zero = new JTextField(15);
    content.add(zero);

    JLabel enterone = new JLabel("Enter First Period");
    content.add(enterone);
    one = new JTextField(15);
    content.add(one);

    JLabel entertwo = new JLabel("Enter Second Period");
    content.add(entertwo);
    two = new JTextField(15);
    content.add(two);

    JLabel enterthree = new JLabel("Enter Third Period");
    content.add(enterthree);
    three = new JTextField(15);
    content.add(three);

    JLabel enterfour = new JLabel("Enter Fourth Period");
    content.add(enterfour);
    four = new JTextField(15);
    content.add(four);

    JLabel enterfive = new JLabel("Enter Fifth Period");
    content.add(enterfive);
    five = new JTextField(15);
    content.add(five);

    JLabel entersix = new JLabel("Enter Sixth Period");
    content.add(entersix);
    six = new JTextField(15);
    content.add(six);

    JLabel enterseven = new JLabel("Enter Seventh Period");
    content.add(enterseven);
    seven = new JTextField(15);
    content.add(seven);

    JLabel entereight = new JLabel("Enter Eight Period");
    content.add(entereight);
    eight = new JTextField(15);
    content.add(eight);

    JLabel space = new JLabel("");
    content.add(space);

    button = new JButton("Enter Classes");
    button.setActionCommand("submit");
    button.addActionListener(this);
    content.add(button);


    f.setContentPane(content);
    content.setVisible(true);
    f.setVisible(true);
}

public void actionPerformed(ActionEvent e){
    if("submit".equals(e.getActionCommand())){

        String zerot = zero.getText();
        classes[0] = zerot;

        String onet = one.getText();
        classes[1] = onet;

        String twot = two.getText();
        classes[2] = twot;

        String threet = zero.getText();
        classes[3] = threet;

        String fourt = zero.getText();
        classes[4] = fourt;

        String fivet = five.getText();
        classes[5] = fivet;

        String sixt = zero.getText();
        classes[6] = sixt;

        String sevent = zero.getText();
        classes[7] = sevent;

        String eightt = eight.getText();
        classes[8] = eightt;

        content.setVisible(false);
        f.add(spane);
        System.out.println(Arrays.toString(classes));
    }
}   
}

Second Class: ScheduleGetterGUI

package Package;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JPanel;

public class ScheduleGetterGUI implements ActionListener{

public GUIRetry classes;
public GUIRetry f;
public String[] schedules = new String[7];
public JComboBox<String> combo;
public JPanel spane;

public static void main (String[] args){
    new ScheduleGetterGUI().Schedule();
}

public void Schedule(){

    spane = new JPanel();
    spane.setLayout(new GridLayout(10,2));

    schedules[0] = "R1";
    schedules[1] = "R2";
    schedules[2] = "Homeroom";
    schedules[3] = "Mass";
    schedules[4] = "Block Odd";
    schedules[5] = "Block Even";
    schedules[6] = "Late Start";

    combo = new JComboBox<String>(schedules);
    combo.setSelectedIndex(0);
    combo.addActionListener(this);
    combo.setVisible(true);

}

@Override
public void actionPerformed(ActionEvent f) {
    String s = (String) combo.getSelectedItem();

    switch (s){
    case "R1": combo.setSelectedIndex(0);
    case "R2": combo.setSelectedIndex(1);
    case "Homeroom": combo.setSelectedIndex(2);
    case "Mass": combo.setSelectedIndex(3);
    case "Block Odd": combo.setSelectedIndex(4);
    case "Block Even": combo.setSelectedIndex(5);
    case "Late Start": combo.setSelectedIndex(6);
    default: combo.setSelectedIndex(0);

    }
}

}

Full Error that occurs after you click "Enter Classes"

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at javax.swing.JFrame.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at Package.GUIRetry.actionPerformed(GUIRetry.java:141)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Andrew Thompson
  • 163,965
  • 36
  • 203
  • 405
  • 2
    You don't initialize spane variable in GUIRetry. – NeplatnyUdaj Sep 11 '15 at 17:05
  • 1
    See [What is a stack trace, and how can I use it to debug my application errors?](http://stackoverflow.com/q/3988788/418556) & [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/q/218384/418556) – Andrew Thompson Sep 11 '15 at 17:06
  • 1
    *"After that, I attempt to set the content pane to invisible, add a panel from another class, and set that other panel visible."* Use a [`CardLayout`](http://download.oracle.com/javase/8/docs/api/java/awt/CardLayout.html) as shown in [this answer](http://stackoverflow.com/a/5786005/418556). – Andrew Thompson Sep 11 '15 at 17:07

1 Answers1

1

You haven't initialized the spane variable in GUIRetry class. That is what causing the exception.

Update:

Here is a quick fix to GUIRetry class using CardLayout. Now when you click on the Enter Classes button, the second panel will be shown.

import java.awt.CardLayout;
import java.awt.Color;
import java.util.Arrays;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;

class GUIRetry implements ActionListener {

public static void main(String[] args) {
    new GUIRetry().GUI();
}

public JFrame f;
public JButton button;
public JTextField zero;
public JTextField one;
public JTextField two;
public JTextField three;
public JTextField four;
public JTextField five;
public JTextField six;
public JTextField seven;
public JTextField eight;
public JPanel content;
public JPanel panel2;
public ScheduleGetterGUI combo;

public String[] classes = new String[9];

final static String PANEL_1 = "Panel 1";
final static String PANEL_2 = "Panel 2";

CardLayout cardLayout;

public void GUI() {

    f = new JFrame("SchoolHelper");
    f.setSize(275, 600);
    f.setResizable(false);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    content = new JPanel(new GridLayout(10, 2));
    content.setBorder(BorderFactory.createLineBorder(Color.black, 2));

    JLabel enterzero = new JLabel("Enter Zero Period");
    content.add(enterzero);
    zero = new JTextField(15);
    content.add(zero);

    JLabel enterone = new JLabel("Enter First Period");
    content.add(enterone);
    one = new JTextField(15);
    content.add(one);

    JLabel entertwo = new JLabel("Enter Second Period");
    content.add(entertwo);
    two = new JTextField(15);
    content.add(two);

    JLabel enterthree = new JLabel("Enter Third Period");
    content.add(enterthree);
    three = new JTextField(15);
    content.add(three);

    JLabel enterfour = new JLabel("Enter Fourth Period");
    content.add(enterfour);
    four = new JTextField(15);
    content.add(four);

    JLabel enterfive = new JLabel("Enter Fifth Period");
    content.add(enterfive);
    five = new JTextField(15);
    content.add(five);

    JLabel entersix = new JLabel("Enter Sixth Period");
    content.add(entersix);
    six = new JTextField(15);
    content.add(six);

    JLabel enterseven = new JLabel("Enter Seventh Period");
    content.add(enterseven);
    seven = new JTextField(15);
    content.add(seven);

    JLabel entereight = new JLabel("Enter Eight Period");
    content.add(entereight);
    eight = new JTextField(15);
    content.add(eight);

    JLabel space = new JLabel("");
    content.add(space);

    button = new JButton("Enter Classes");
    button.setActionCommand("submit");
    button.addActionListener(this);
    content.add(button);

    cardLayout = new CardLayout();

    f.getContentPane().setLayout(cardLayout);

    f.getContentPane().add(content);

    panel2 = new JPanel();

    panel2.add(new JLabel("This is panel 2"));

    f.add(content, PANEL_1);
    f.add(panel2, PANEL_2);

    f.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
    if ("submit".equals(e.getActionCommand())) {

        String zerot = zero.getText();
        classes[0] = zerot;

        String onet = one.getText();
        classes[1] = onet;

        String twot = two.getText();
        classes[2] = twot;

        String threet = zero.getText();
        classes[3] = threet;

        String fourt = zero.getText();
        classes[4] = fourt;

        String fivet = five.getText();
        classes[5] = fivet;

        String sixt = zero.getText();
        classes[6] = sixt;

        String sevent = zero.getText();
        classes[7] = sevent;

        String eightt = eight.getText();
        classes[8] = eightt;

        cardLayout.show(f.getContentPane(), PANEL_2);//Also "Panel 2" can be used as the second argument 

        System.out.println(Arrays.toString(classes));
    }
}
}

References: https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html

shan1024
  • 1,322
  • 6
  • 17
  • I'm not exactly sure how to initialize spane. I'm fairly new to Java and extremely new to Swing. – jonlogrippo Sep 11 '15 at 17:14
  • 1
    As Andrew Thompson mentioned, what you are looking for is CardLayout. I will update my post with an example in few minutes. – shan1024 Sep 11 '15 at 17:18