2012-08-10 67 views
4

這是一個相當常見的問題,我使用的解決方案類似於what I searched,稍後會發現。一個實現了JLabel啓用或禁用本身基於當前選擇的指數ListCellRenderer禁用單個JComboBox項目

public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
    setText(value.toString()); 
    UIDefaults defaults = UIManager.getDefaults(); 
    Color fc; 
    if (index == 1) { 
     setEnabled(false); 
     fc = defaults.getColor("Label.disabledForeground"); 
     setFocusable(false); 
    } else { 
     // fc = defaults.getColor("Label.foreground"); 
     fc = list.getForeground(); 
     setEnabled(list.isEnabled()); 
     setFocusable(true); 
    } 
    setForeground(fc); 
    setBackground(isSelected ? list.getSelectionBackground() : list 
      .getBackground()); 
    return this; 
} 

的問題是,即使在視覺列表項顯示爲禁用,它仍然可以儘管setFocusable呼叫選擇。 我該如何真正禁用它?

回答

3

您需要某種方法來阻止ComboBox無法設置無法從中選擇的項目。

我能想到的最簡單的方法是在模型本身中捕捉選擇的變化。

public class MyComboBoxModel extends DefaultComboBoxModel { 

    public MyComboBoxModel() { 

     addElement("Select me"); 
     addElement("I can be selected"); 
     addElement("Leave me alone"); 
     addElement("Hit me!!"); 

    } 

    @Override 
    public void setSelectedItem(Object anObject) { 

     if (anObject != null) { 

      if (!anObject.toString().equals("Leave me alone")) { 

       super.setSelectedItem(anObject); 

      } 

     } else { 

      super.setSelectedItem(anObject); 

     } 

    } 

} 

現在,這是一個快速入門,以證明這一點。你真的需要的是將某些items標記爲不可選。我能想到的最簡單的方法是在item中提供一個屬性,例如isSelectable

如果做不到這一點,你可以構造一個特殊的ComboBoxModel維持包含引用的所有不可選擇items,使快速model.contains(item)可以用來確定是否選擇此項目,或者不是一個獨立的內部模型。