2012-08-10 77 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)可以用来确定是否选择此项目,或者不是一个独立的内部模型。