# disable in JComboBox



## zahil (29. Nov 2006)

hallo,

ich habe eine kleine frage. kann man einige Items einer JComboBox 'disabled' machen? (z.B einmal war ein item selektiert und darf nicht wiederholt werden, ich will dass dieser item wird nicht überhaupt angezeigt als ein wahl) 

weisst jemand ein geeignete methode?


----------



## Azrahel (29. Nov 2006)

hmm mit remove(int) und remove(Compontent) sollte man Items aus der Liste wieder rauslöschen können.


----------



## m@nu (30. Nov 2006)

ist recht kompliziert, wenn du wirklich die items an sich deaktivieren willst. (naja, mehr oder weniger  )
du musst im model des items speichern, ob das item aktiv ist oder nicht.

anschliessend schreibst du dir einen eigenen ListCellRenderer, welcher dir die anzeige übernimmt:

```
private class CellRenderer extends JLabel implements ListCellRenderer {

            public TypeCellRenderer() {
                setOpaque(true);
            }

            public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) {
                MyItemModel model = (MyItemModel)value;
                setText(model.getText());
                setEnabled(model.isEnabled());

                /* Farben: */
                if (isSelected) {
                    setBackground(list.getSelectionBackground());
                    setForeground(list.getSelectionForeground());
                } else {
                    setBackground(list.getBackground());
                    setForeground(list.getForeground());
                }
                
                /* Rückgabe: */
                return this;
            }
        }
```

jetzt werden die items zwar deaktiviert angezeigt. auswählen kannst du sie aber immernoch.
dies kannst du mit einem ActionListener unterbinden:

```
private class ItemActionListener implements ActionListener {
	        
	        /* Verweise: */
	        private JComboBox comboBox;
	        private MyItemModel currentItem;
	        
	        public ItemActionListener(final JComboBox comboBox) {
	            this.comboBox = comboBox;
	            currentItem = (MyItemModel)comboBox.getSelectedItem();
	        }
	        
            public void actionPerformed(final ActionEvent arg0) {
                MyItemModel tempItem = (MyItemModel)comboBox.getSelectedItem();
                
                if(tempItem.isEnabled()) {
                    comboBox.setSelectedItem(currentItem);
                } else {
                    currentItem = tempItem;
                }
            }
	    }
```

jetzt das ganze noch deiner ComboBox zuweisen:

```
combo.setCellRenderer(new CellRenderer());
combo.addActionListener(new ItemActionListener(combo));
```

sollte funktionieren.
was natürlich noch fehlt, ist die logik, welche dir bereits einmal ausgewählte items deaktiviert.


----------

