2012-08-10 5 views
4

이것은 매우 일반적인 문제이며 사용 된 솔루션은 what I searched과 유사하며 나중에 발견되었습니다. 하나는 현재 선택된 인덱스를 기반으로 사용하거나 사용 자체를 사용할 수 없게 JLabelListCellRenderer을 구현개별 JComboBox 항목 비활성화

문제는 시각적으로 목록 항목이 비활성화로 나타난다하더라도, 그것은 여전히 ​​ setFocusable 호출에도 불구하고 선택할 수 있다는 점이다
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; 
} 

. 어떻게 실제로 비활성화합니까?

답변

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을 선택 취소 할 수있는 것으로 표시하는 것입니다. 내가 생각할 수있는 가장 쉬운 방법은 예를 들어 isSelectable과 같은 item에 속성을 제공하는 것입니다.

못 찾으면, 당신은 항목을 선택인지 아닌지 빠른 model.contains(item)를 결정하는 데 사용될 수 있도록, 모든하거나 선택되지 items에 대한 참조가 포함 된 별도의 내부 모델을 유지하는 특별한 ComboBoxModel를 구성 할 수있다.