0

Here is a scenario:

I have two JComboBoxes (call them combo1 and combo2 ) that get their values from a database[In the DB, these two have a 1:M relationship]. When the screen shows up I populate combo1 with values from the database and then take the first entry in the list and get its corresponding values to populate combo2.

Since the values of combo2 depend on what is selected in combo1, every time the selection changes in combo1 a call is made to the database to get matching values to populate combo2.

Now here is a problem:

Say I have two entries in combo1 and the second entry has no corresponding values for combo2. When I select the second entry of combo1, the last selected value on combo2 does not clear. [Remember the model for combo2 is empty and therefore there shouldn't anything selected]

Qeustion: How do I clear the text in combo2 if the model is empty?

Here is a sample code:

public void select(final Entry entry) {
      if (entry == null)
         return;

         int index = entryList.indexOf(entry); // instance of SelectionInList from JGoodies
         boolean positive = index >= 0 && index <= entryList.getSize() - 1;

         if (positive) {

              entryList.setSelection(entry);


               subEntryList.setList(entryList.loadSubEntries(entry.getID()));
               if (!subEntryList.isEmpty()) {
                    SubEntry e = subEntryList.getElementAt(0);
                    select(e);
                 }
        }

}

kleopatra
  • 51,061
  • 28
  • 99
  • 211
user276002
  • 178
  • 3
  • 10

3 Answers3

1

If you have an empty combobox model the view should clear automatically. If you derived an own model do not forget to call DefaultComboBoxModel.fireIntervalRemoved() if you remove entries.

Another (in this case not recommended) way is to use combobox.setSelectedItem(null);.

Howard
  • 38,639
  • 9
  • 64
  • 83
  • Regarding the first part, yes that is what I've always thought and now this problem. The funny thing is that the model indicates that there are no items yet the last selected one shows on the UI. – user276002 Apr 09 '11 at 13:57
  • @user276002 it actually does. So the issue seems to be somewhere else in your code. Please post the relevant parts such that we can have a look. – Howard Apr 09 '11 at 14:06
  • Here is a breakdown of my code: I am using JGoodies Binding, so here is the line where I bind the JComboBoxes to the corresponding models: 'Bindings.bind(combo1, entryrModel.getEntryList()); Bindings.bind(combo2, entryModel.getSubEntryList());` – user276002 Apr 09 '11 at 14:36
  • Here is a breakdown of my code: I am using JGoodies Binding, so here is the line where I bind the JComboBoxes to the corresponding models: **Bindings.bind(combo1, entryrModel.getEntryList()); Bindings.bind(combo2, entryModel.getSubEntryList());** Here is the action listener for combo1: **private final class EntryComboActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { entryModel.select((Entry) combo1.getSelectedItem()); } }** combo2 has a similar structure.. – user276002 Apr 09 '11 at 14:48
0

Replace the model in the second combo box when you make a selection in the first:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ComboBoxTwo extends JFrame implements ActionListener
{
    private JComboBox mainComboBox;
    private JComboBox subComboBox;
    private Hashtable subItems = new Hashtable();

    public ComboBoxTwo()
    {
        String[] items = { "Select Item", "Color", "Shape", "Fruit" };
        mainComboBox = new JComboBox( items );
        mainComboBox.addActionListener( this );

        //  prevent action events from being fired when the up/down arrow keys are used
//      mainComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
        getContentPane().add( mainComboBox, BorderLayout.WEST );

        //  Create sub combo box with multiple models

        subComboBox = new JComboBox();
        subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4
        getContentPane().add( subComboBox, BorderLayout.EAST );

        String[] subItems1 = { "Select Color", "Red", "Blue", "Green" };
        subItems.put(items[1], subItems1);

        String[] subItems2 = { "Select Shape", "Circle", "Square", "Triangle" };
        subItems.put(items[2], subItems2);

        String[] subItems3 = { "Select Fruit", "Apple", "Orange", "Banana" };
        subItems.put(items[3], subItems3);
//      mainComboBox.setSelectedIndex(1);
    }

    public void actionPerformed(ActionEvent e)
    {
        String item = (String)mainComboBox.getSelectedItem();
        Object o = subItems.get( item );

        if (o == null)
        {
            subComboBox.setModel( new DefaultComboBoxModel() );
        }
        else
        {
            subComboBox.setModel( new DefaultComboBoxModel( (String[])o ) );
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new ComboBoxTwo();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
     }
}
camickr
  • 321,443
  • 19
  • 166
  • 288
-1

Just do this:

jcombobox.setSelectedIndex(-1);

after:

jcombobox.getSelectedIndex();
Paul Roub
  • 36,322
  • 27
  • 84
  • 93