Search code examples
javaswingjcomboboxactionlistener

Dynamic JComboBoxes


I have following data (String):

Course1: A1
Course1: A2
Course2: B1
Course2: B2
Course2: B3
Course2: B4
Course3: C1
Course3: C2

I'd like to create two JComboBox (JComboBox1, JComboBox2) so that JComboBox1 contains Course1,Course2,Course3, etc.

If I select, say, Course2 from JComboBox1 then corresponding B1,B2,B3,B4 should be populated in JComboBox2.

How to implement this? Many Thanks.


Solution

  • Yes, simply create a DefaultComboBoxModel for each set, and do setModel() on JComboBox2 when JComboBox1 changes.

    Addendum: For example,

    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.ComboBoxModel;
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class ComboTest extends JPanel implements ActionListener, Runnable {
    
        private final JComboBox combo1 = new JComboBox(
            new String[]{"Course 1", "Course 2", "Course 3"});
        private final JComboBox combo2 = new JComboBox();
        private ComboBoxModel[] models = new ComboBoxModel[3];
    
        public ComboTest() {
            models[0] = new DefaultComboBoxModel(
                new String[]{"A1", "A2"});
            models[1] = new DefaultComboBoxModel(
                new String[]{"B1", "B2", "B3", "B4"});
            models[2] = new DefaultComboBoxModel(
                new String[]{"C1", "C2"});
    
            combo2.setModel(models[0]);
            this.add(combo1);
            this.add(combo2);
            combo1.addActionListener(this);
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            int i = combo1.getSelectedIndex();
            combo2.setModel(models[i]);
        }
    
        @Override
        public void run() {
            JFrame f = new JFrame("ComboTest");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(this);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new ComboTest());
        }
    }