Question

The goal of this project is to create four classes: a Student class, a GradStudent class, a Manager class, and a GUI class. Within the GUI there are two radio buttons: one for Student and one for GradStudent. Depending on which one is selected, the Manager class is supposed to be responsible for creating and storing the Student or GradStudent objects by use of two arrays. I have all of my classes programmed out, but when I select either one of the radio buttons, I get errors in Manager.getLastGradStudent which in turn gives me an error in my JRBListener class. I will post the GUI and Manager classes below. Any help would be greatly appreciated!

MANAGER CLASS:

public class Manager {
    private Student[] students = new Student[50];
    private int counter1 = 0;

    private GradStudent[] gradStudents = new GradStudent[50];
    private int counter2 = 0;

    public Manager() {

    }

    public void addStudent(String name, String address, String balance, String major) {
        Student student1 = new Student(name, address, balance, major);
        students[counter1] = student1;
                counter1++;
    }
    public String getLastStudent() {
        return "Student added: " + students[counter1-1] +"\n";
    }

    public void addGradStudent(String name, String address, String balance, String major) {
        GradStudent student2 = new GradStudent(name, address, balance, major);
        gradStudents[counter2] = student2;
                counter2++;
    }
    public String getLastGradStudent() {
        return "Graduate Student added: " + gradStudents[counter2-1] +"\n";
    }
}

GUI CLASS:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;


public class GUI extends JFrame {
    private JRadioButton jrbStudent = new JRadioButton("Student");
    private JRadioButton jrbGraduate = new JRadioButton("Graduate");
    private JTextField name = new JTextField(20);
    private JTextField address = new JTextField(20);
    private JTextField balance = new JTextField(20);
    private JTextField major = new JTextField(20);
    private JButton jbtSubmit = new JButton("Submit");
    private JTextArea echoStudent = new JTextArea();
    private Manager m1 = new Manager();

    public GUI() {

        // Creates panel P1 and adds the components
        JPanel p1 = new JPanel(new GridLayout(7, 1));
        p1.add(new JLabel("Name: "));
        p1.add(name);
        p1.add(new JLabel("Address: "));
        p1.add(address);
        p1.add(new JLabel("Balance: "));
        p1.add(balance);
        p1.add(new JLabel("Major: "));
        p1.add(major);
        p1.add(jrbStudent);
        p1.add(jrbGraduate);
        p1.add(new JLabel("Submit Button: "));
        p1.add(jbtSubmit);
        p1.add(new JLabel("Submitted Text: "));

        // Creates a radio-button group to group both buttons
        ButtonGroup group = new ButtonGroup();
        group.add(jrbStudent);
        group.add(jrbGraduate);

        // Adds the panel and text area to the frame
        add(p1);
        p1.add(echoStudent);
        echoStudent.setEditable(false);

        // Creates a listener and registers it with the submit button
        SubmitListener l1 = new SubmitListener();
        jbtSubmit.addActionListener(l1);

        // Creates a listener and registers it with the radio buttons
        JRBListener l2 = new JRBListener();
        jrbStudent.addActionListener(l2);
        jrbGraduate.addActionListener(l2);
    }

    // Class to handle the submit button
    class SubmitListener implements ActionListener {
        public void actionPerformed(ActionEvent a) {
            Student[] students = new Student[50];
            int arrayLocation = 0;

            Student student1 = new Student(name.getText(), address.getText(),
                    balance.getText(), major.getText());
            // Checks remaining array space
            if (arrayLocation < 50) {
                students[arrayLocation] = student1;
                ++arrayLocation;
            }
            // Echos back entered text while storing the previous text
            echoStudent.setText(echoStudent.getText() + "\n"
                    + student1.toString());
        }
    }

    // Class to handle the radio buttons
    class JRBListener implements ActionListener {
        public void actionPerformed(ActionEvent b) {
            if(b.getSource() == jrbStudent)
                m1.addStudent(name.getText(), address.getText(), balance.getText(), major.getText());
            echoStudent.setText("Created Student: \n" + m1.getLastStudent());

            if(jrbGraduate.isSelected())
                m1.addGradStudent(name.getText(), address.getText(), balance.getText(), major.getText());
            echoStudent.setText("Created Graduate Student: \n" + m1.getLastGradStudent());
        }
    }

    public static void main(String[] args) {
        GUI frame = new GUI();
        frame.setTitle("Information Interface");
        frame.setSize(1200, 900);
        frame.setLocationRelativeTo(null); // Center the frame
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }

}

Errors that I receive:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at Manager.getLastGradStudent(Manager.java:28)
    at GUI$JRBListener.actionPerformed(GUI.java:93)
    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.JToggleButton$ToggleButtonModel.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)
Was it helpful?

Solution

The problem in your code is that you did not set any brackets that define the if-scope in JRBListener.actionPerformed() method. If no brackets are set, only the one next line after if-condition is considered to be in the scope. So, in your case, no matter if a student was added or not, the program will always try to state a "Student added!" message :-) This only makes sense if you actually added a student:

public void actionPerformed(ActionEvent b) {
       if (b.getSource() == jrbStudent) {
           m1.addStudent(name.getText(), address.getText(), balance.getText(), major.getText());
           echoStudent.setText("Created Student: \n" + m1.getLastStudent());
       }

       if (jrbGraduate.isSelected()) {
            m1.addGradStudent(name.getText(), address.getText(), balance.getText(), major.getText());
            echoStudent.setText("Created Graduate Student: \n" + m1.getLastGradStudent());
       }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top