4

This is driving me insane. I'm trying to change the panels when you click on 3 different buttons and it works, but for one panel - only once.

If you click addPerson - the Person panel shows, If you then click addCD - the CD panel shows; (same for view store) If you then click on addPerson - it doesn't work. It throws a nullpointer exception. Even if you click on addCD/viewstore and THEN add Person it shows but it just won't show a second time.

In a test file, I created a GUI with an add and remove: if I clicked add it threw the null pointer exception but if I just added it already and compiled, it was fine...

/* PERSON PANEL */
public JPanel create_PersonPnl()
{
    personPnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
    personPnl.setBackground(Color.WHITE);
    personPnl.setPreferredSize(minPnl);

    /* VERTICAL BOX for Person boxes */
    Box personBox = Box.createVerticalBox();
    personBox.setBorder(new TitledBorder(new LineBorder(Color.DARK_GRAY), "Person"));

        /* Horizontal Box for Name Lbl & TF */
        Box nameBox = Box.createHorizontalBox();
            nameBox.add(Box.createHorizontalStrut(10));
            nameLbl = new JLabel("Name: ");
            nameBox.add(nameLbl);
            nameBox.add(Box.createHorizontalStrut(5));
            nameTF = new JTextField();
            nameBox.add(nameTF);
            nameBox.add(Box.createHorizontalStrut(10));

        personBox.add(nameBox);
        personBox.add(Box.createVerticalStrut(10));
        Box limitBox = Box.createHorizontalBox();
            limitBox.add(Box.createHorizontalStrut(10));
            limitLbl = new JLabel("CD Limit: ");
            limitBox.add(limitLbl);
            limitTF = new JFormattedTextField();
            limitBox.add(limitTF);
            limitBox.add(Box.createHorizontalStrut(10));
        personBox.add(limitBox);
        personBox.add(Box.createVerticalStrut(10));
        personBox.add(addPersonBtn = new JButton("Add Person"));
        personBox.add(Box.createVerticalStrut(10));
            personList = new JList(temp);
            personList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            scrollp = new JScrollPane(personList);
                scrollp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                scrollp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            scrollp.setSize(100, 45);
            personBox.add(scrollp);
            personBox.add(Box.createVerticalStrut(10));
        Box optionsBox = Box.createHorizontalBox();
            editPrsnBtn = new JButton("Edit");
            editPrsnBtn.addActionListener(this);
            optionsBox.add(editPrsnBtn);
            removePrsnBtn = new JButton("Remove");
            removePrsnBtn.addActionListener(this);
            optionsBox.add(removePrsnBtn);
        personBox.add(optionsBox);

    personPnl.add(personBox);
    return personPnl;
}

This is what is in my ActionPerformed method.

if(e.getSource() == addPersonBtn)
    {
        changePnl.removeAll();
        changePnl.add(create_PersonPnl());
        changePnl.revalidate();
        System.out.println("PersonPnl added");
    }

    if(e.getSource() == addCDBtn)
    {
        changePnl.removeAll();
        changePnl.add(create_CDPnl());
        changePnl.revalidate();
    }

    if(e.getSource() == viewStoreBtn)
    {
        changePnl.removeAll();
        changePnl.add(create_StorePnl());
        changePnl.revalidate();
    }

Only code for ChangePnl.

  changePnl = new JPanel();
  changePnl.setBackground(Color.WHITE);
defaultPnl = new JPanel();
defaultPnl.setBackground(Color.WHITE);
defaultPnl.add(new JLabel("Welcome to the CD Store"));
defaultPnl.add(new JLabel("Click an option from the left"));
changePnl.add(defaultPnl);

The S.O.P was to debug to see what was being run.. and that only prints once and that's it unless I take out .add(create_PersonPnl()); so I've narrowed it but I don't have a clue since it works the first time.

Thank in advance!

Separate test file to prove it's create_PersonPnl()

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

public class Test implements ActionListener
{
JButton add, remove;
JButton addPersonBtn, editPrsnBtn, removePrsnBtn;
JFrame frame;
JFormattedTextField limitTF;
JLabel nameLbl, limitLbl;
JList personList;
JPanel  TotalGUI, welcomePnl, mainPnl, imagePnl, changePnl, defaultPnl, cdPnl,       storePnl;
JPanel personPnl;
JScrollPane scrollp;
JTextField nameTF;

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
Dimension minPnl = new Dimension(300, 400);

/* Test for JList */
String[] temp = {"1", "2", "3", "4", "1", "2", "3", "4","1", "2", "3", "4","1", "2", "3", "4" };

public Test()
{
    frame = new JFrame("CD Store");
    frame.setExtendedState(JFrame.NORMAL);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //frame.pack(); //sets size based on components size in TotalGUI
    //frame.setJMenuBar(create_MenuBar());
    //frame.setMinimumSize(minDim);

    frame.setSize(725, 550);

    //set frame location (central to screen)
    int fw = frame.getSize().width;
    int fh = frame.getSize().height;
    int fx = (dim.width-fw)/2;
    int fy = (dim.height-fh)/2;


    frame.getContentPane().add(create_Content_Pane());
    frame.setVisible(true);

    //moves the frame to the centre
    frame.setLocation(fx, fy);
}

public JPanel create_Content_Pane()
{
    JPanel TotalGUI = new JPanel();

    TotalGUI.add(remove = new JButton("Remove"));
    remove.addActionListener(this);

    TotalGUI.add(add = new JButton("Add")); <- this crashes when selected
    add.addActionListener(this);

    //TotalGUI.add(create_PersonPnl()); <- works just fine

    return TotalGUI;
}

public JPanel create_PersonPnl()
{
    personPnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
    personPnl.setBackground(Color.WHITE);
    personPnl.setPreferredSize(minPnl);

    /* VERTICAL BOX for Person boxes */
    Box personBox = Box.createVerticalBox();
    personBox.setBorder(new TitledBorder(new LineBorder(Color.DARK_GRAY), "Person"));

        /* Horizontal Box for Name Lbl & TF */
        Box nameBox = Box.createHorizontalBox();
            nameBox.add(Box.createHorizontalStrut(10));
            nameLbl = new JLabel("Name: ");
            nameBox.add(nameLbl);
            nameBox.add(Box.createHorizontalStrut(5));
            nameTF = new JTextField();
            nameBox.add(nameTF);
            nameBox.add(Box.createHorizontalStrut(10));

        personBox.add(nameBox);
        personBox.add(Box.createVerticalStrut(10));
        Box limitBox = Box.createHorizontalBox();
            limitBox.add(Box.createHorizontalStrut(10));
            limitLbl = new JLabel("CD Limit: ");
            limitBox.add(limitLbl);
            limitTF = new JFormattedTextField();
            limitBox.add(limitTF);
            limitBox.add(Box.createHorizontalStrut(10));
        personBox.add(limitBox);
        personBox.add(Box.createVerticalStrut(10));
        personBox.add(addPersonBtn = new JButton("Add Person"));
        personBox.add(Box.createVerticalStrut(10));
            personList = new JList(temp);
            personList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            scrollp = new JScrollPane(personList);
                scrollp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                scrollp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            scrollp.setSize(100, 45);
            personBox.add(scrollp);
            personBox.add(Box.createVerticalStrut(10));
        Box optionsBox = Box.createHorizontalBox();
            editPrsnBtn = new JButton("Edit");
            editPrsnBtn.addActionListener(this);
            optionsBox.add(editPrsnBtn);
            removePrsnBtn = new JButton("Remove");
            removePrsnBtn.addActionListener(this);
            optionsBox.add(removePrsnBtn);
        personBox.add(optionsBox);

    personPnl.add(personBox);
    return personPnl;
}

public static void main(String[] args)
{
    new Test();
}

public void actionPerformed(ActionEvent e) 
{
    if(e.getSource() == remove)
    {
        TotalGUI.removeAll();
        TotalGUI.revalidate();
    }

    if(e.getSource() == add)
    {
        TotalGUI.add(create_PersonPnl());
        TotalGUI.revalidate();
    }
}
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
liloka
  • 1,016
  • 4
  • 14
  • 29
  • This: public JPanel create_PersonPnl() { personPnl = new JPanel(new FlowLayout(FlowLayout.CENTER)); return personPnl; } Seems fine. Is something happening to `changePnl` that we aren't seeing? – David Feb 09 '12 at 23:46
  • 1
    please learn java naming conventions and stick to them – kleopatra Feb 10 '12 at 09:50

1 Answers1

1

In your method

public JPanel create_Content_Pane()
{
    JPanel TotalGUI = new JPanel();

    TotalGUI.add(remove = new JButton("Remove"));
    remove.addActionListener(this);

    TotalGUI.add(add = new JButton("Add")); <- this crashes when selected
    add.addActionListener(this);

    //TotalGUI.add(create_PersonPnl()); <- works just fine

    return TotalGUI;
}

The NullPointerException occurs because your private field TotalGUI is null... Remove the JPanel declaration in front of TotalGUI = new JPanel(); That will solve the null pointer problem. This probably solves only your problem in the test scenario... To solve the problem in your original scenario it would be nice to have the complete source code of the class..

Vossi
  • 231
  • 2
  • 8
  • Damnit, I should have seen that. In my other code with everything in the TotalGUI panel is globally declared. But thanks for that! – liloka Feb 10 '12 at 00:37
  • I think your problem there is also that something of your globally declared fields might be null or anything like that.. But I actually can not see it without the complete code – Vossi Feb 10 '12 at 00:45
  • Well I've somehow fixed my problem. I copied the CD panel into the person and renamed every component one by one and recompiled. Turns out there was something wrong with my JFormattedTextField, it had a wrong argument. What I still don't understand is the fact that it would work the first time, and not any others. Thank you fr all of your replies! – liloka Feb 10 '12 at 21:52