Reputation: 1251
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
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"));
}
Upvotes: 5
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