Akki
Akki

Reputation: 1251

Disable JComboBox items at runtime

1.I have created an JComboBox and Jtable when user select items from JComboBox they are added in the JTable.
2.I dont want to allow the user to select the items that have been previously selected by him in JComboBox.
3.So the selected choices must be disabled (not chooseable). How should i do this? 4.The below code removes that selected item from JComboBox after it has been added in JTable but i am interested in disabling it

        String getchoice=(String)selectedgames_combobox.getSelectedItem();

        DefaultTableModel gamesmodel = new DefaultTableModel(); 

        //adding selected choices from JComboBox in JTable 
        gamesmodel.addColumn("Selected Games");     
        gamesmodel.insertRow(gamesmodel.getRowCount(),new Object[]{ getchoice }) ;  

        //refreshing table
        games_table.setModel(gamesmodel);

        //removing the selected item from JComboBox
        selectedgames_combobox.removeItem(getchoice);

Upvotes: 5

Views: 7071

Answers (2)

Ömer Faruk Almalı
Ömer Faruk Almalı

Reputation: 3822

Assume that you have a list that contains some elements which should be disabled, you need to change appeareance of disabled elements and need to prevent user to select those items. To be able to prevent user to select disabled ones you need to override setSelectedIndex method of JComboBox like this:

public void setSelectedIndex(int index) {
   if (!disabled_items.contains(index)) {
       super.setSelectedIndex(index);
   }
}

Also you can change colors of items in BasicComboBoxRenderer like this:

if (disabled_items.contains(index)) {
     setBackground(list.getBackground());
     setForeground(UIManager.getColor("Label.disabledForeground"));
}

For further details.

Upvotes: 5

Kirill
Kirill

Reputation: 41

Here is my solution (may be useful)

/**
 * A ComboBox with Enabling/disabling items support
 */
public class AvailableItemComboBox extends JComboBox {
    private static final long serialVersionUID = 1L;

    // previosly chosen item
    protected int old = -1;

    /**
     * Default constructor
     */
    public AvailableItemComboBox() {
        super();
        setRenderer(new EnabledJComboBoxRenderer());    
        initializeComboBox();
    }

    /**
     * Constructor with model
     * 
     * @param model
     */
    public AvailableItemComboBox(ComboBoxModel model) {
        super(model);
        setRenderer(new EnabledJComboBoxRenderer());
        initializeComboBox();
        System.out.println("selected index is " + getSelectedIndex());
    }

    /**
     * Constructor with data
     * 
     * @param model
     */
    public AvailableItemComboBox(Available[] items) {
        super(items);
        setRenderer(new EnabledJComboBoxRenderer());
        initializeComboBox();
        System.out.println("selected index is " + getSelectedIndex());
    }

    private void initializeComboBox() {
        setSelectedIndex(findFirstAvailableItem());

        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {    
                System.out.println("Listener called>>>>>>>>>>>>>>>>>>");                
                if (old != getSelectedIndex()) {
                    if (!((Available) getSelectedItem()).isEnabled()) {
                        setSelectedIndex(old);
                    } else {
                        old = getSelectedIndex();
                    }
                }
            }       
        });
    }

    // Finds first selecteditem and sets it as previous state
    private int findFirstAvailableItem() {
        int result = -1;

        for (int index = 0; index < this.getItemCount(); index++) {
            if (((Available)this.getItemAt(index)).isEnabled()) {
                result = index;
                break;
            }
        }

        old = result;
        return result;
    }
}

public class EnabledJComboBoxRenderer extends BasicComboBoxRenderer {
private static final long serialVersionUID = 1L;

private Color disabledColor = Color.lightGray;

/**
 * Constructs a new renderer for a JComboBox which enables/disables items
 * based upon the parameter model.
 * 
 * @param enabled
 */
public EnabledJComboBoxRenderer(){
    super();        
}

/**
 * Sets the color to render disabled items.
 *  
 * @param disabledColor
 */
public void setDisabledColor(Color disabledColor){
    this.disabledColor = disabledColor;
}

/**
 * Custom implementation to color items as enabled or disabled.
 * 
 * @inheritDoc
 */
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

    boolean enabled = ((Available) value).isEnabled();

    if (!enabled) {
        if (isSelected) {
            c.setBackground(UIManager.getColor("ComboBox.background"));
        } else {
            c.setBackground(super.getBackground());
        }
        c.setForeground(disabledColor);
    } else {
        c.setBackground(super.getBackground());
        c.setForeground(super.getForeground());
    }

    return c;
}

}

public interface Available {
public boolean isEnabled();
public void setEnabled(boolean enable);

}

Upvotes: 0

Related Questions