javaawtitemlistener

why doesn't my itemlistener always trigger


enter image description hereI'm a new programmer and I'm working on a text adventure that uses dropdown boxes (choice) as an input device. I have an itemListener on the first box that populates the members of the 2nd with the members that can be added. The player is then allowed to click the submit button and the first box is reset to the first item on the list and the second box is supposed to be cleared. When I run the program, the first time it reacts exactly as planned. The 2nd time I try to input something using the drop down boxes, the dropdown box doesn't respond. I put a marker inside the itemListener to see if it was even triggering to find out that it wasn't. I feel like I've tweeked the program in every way imaginable but I have no idea what is causing this issue. If I toggle between the items in the drop down box a few times the itemListener starts to respond again.

This is a representation of my issue I threw together.

import java.awt.Choice;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;


public class gui implements ActionListener
{
private static JTextPane outputField = new JTextPane();
private static JPanel mainPanel = new JPanel(new GridBagLayout());
private Choice commandDropDown = new Choice();
private Choice itemDropDown = new Choice();
private JButton submitButton = new JButton();

public gui()
{
    JFrame frame = new JFrame("test");
    mainPanel.setSize(450,585);

    commandDropDown = buildCommandBox(commandDropDown);
    commandDropDown.setBounds(100, 15, 100, 40);
    itemDropDown.setBounds(200, 15, 100, 40);
    submitButton.setText("submit");
    submitButton.setBounds(15, 15, 100, 40);
    submitButton.addActionListener(this);
    frame.add(commandDropDown);
    frame.add(itemDropDown);
    frame.add(submitButton);
                frame.setResizable(false);
        frame.pack();
        frame.setSize(300, 300);
        //frame.setLayout(null);
        //frame.setLocationRelativeTo(null);
        frame.setVisible(true);

}
public void actionPerformed(ActionEvent e)
{
    itemDropDown.removeAll();
    commandDropDown.select(0);
}

private Choice buildCommandBox(Choice custoChoi)
{
   final Choice c = new Choice();

   c.addItem("choices");
   c.addItem("Option1");
   c.addItemListener(new ItemListener()
           {                   
                public void itemStateChanged(ItemEvent ie)
                {
                    System.out.println("the action event for the command"
                            + "box is working.");
                    if(c.getSelectedItem().equals("Option1"))
                    {
                        itemDropDown.addItem("things");
                        itemDropDown.addItem("stuff");
                    }
                }
           });

   return c;
}
}

Hopefully these pictures clear up any confusion about my post. https://i.sstatic.net/RQcDe.jpg


Solution

  • In my opinion, your buildCommandBox( Choice custoChoi) is wrong, it should be something like that:

    private Choice buildCommandBox(final Choice custoChoi) {
    
        custoChoi.addItem("choices");
        custoChoi.addItem("Option1");
        custoChoi.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent ie) {
                System.out.println("the action event for the command" + "box is working.");
                if (custoChoi.getSelectedItem().equals("Option1")) {
                    itemDropDown.addItem("things");
                    itemDropDown.addItem("stuff");
                }
            }
        });
    
        return custoChoi;
    }
    

    I would recommand to use JComboBox instants of Choice, if Swing is allowed.