Disable JComboBox items at runtime

1. I created JComboBox and Jtable when the user selects the elements from the JComboBox that they added to the JTable.
          2.I do not want the user to be able to select items that were previously selected by him in JComboBox.
          3. The selected options should be disabled (not selected) . How should I do it? 4. The code below removes this selected item from the JComboBox after adding it to JTable, but I'm 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);
+5
source share
2 answers

, , , , . , setSelectedIndex JComboBox :

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

BasicComboBoxRenderer :

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

....

+5

( )

/**
 * 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);

}

0

All Articles