2011-04-10 2 views
2

JComboBox에 런타임시 변경할 수있는 임의 항목이 있습니다. getListCellRendererComponent (...)를 사용하여 JLabel로 설정했습니다. 나는 또한 일부 Jlabel을 setEnabled (false)로 설정했다.선택된 JComboBox 항목이 활성화 또는 비활성화되었는지 감지

사용자가 해당 JComboBox에서 항목을 선택하면 이 사용 또는 사용 중지 된 경우 감지 할 수있는 방법이 있습니까?

+0

어쩌면 내가 설명을 잘못 이해하고 있지만 ... _components_를 (를) 절대로 항목으로 추가하지 마십시오. 너 - 그러지? – kleopatra

+0

@kleopatra : 예, 할 수 있습니다. 문제가 있습니까? 나는 아이콘을 넣을 + 일부 항목을 해제해야합니다. – Brad

+0

문제는 별도의 관심사를 섞어 버리는 것입니다. 스윙은 분리 된 상태로 유지하는 데 긴 시간을 소요합니다. 그래서 렌더러가 있습니다. 더 답답한 디자인하는 방법에 대한 내 대답을 참조하십시오. – kleopatra

답변

2

renederer는 그 (것)들을 페인트하기 만하므로 검사 할 isEnabled 값이 없습니다. 그 대신 cellRenderer가 선택을 볼 때 값이 허용되는지를 결정하는 데 사용하는 동일한 논리를 사용하십시오. 또는 비활성화 된 값 대신 목록에서 해당 값을 제거 할 수도 있습니다.

+1

물론 '같은 논리'를 사용하면 메서드에 추출하여 해당 메서드를 호출해야합니다. –

+0

동일한 논리를 사용하는 것이 나의 대안이었습니다. 나는 다른 방법이 있기를 바랐다. – Brad

1

목록/콤보 (또는 컬렉션 구성 요소)의 항목은 일부 상태가있는 비즈니스 개체의 표현으로 간주됩니다. 그런 다음 다른 상태를 인식하는 렌더러를 구현하고 렌더러에서 상태를 적절한 시각적 표현으로 매핑합니다.

// the item 
public class Valve { 
    private boolean open; 
    private boolean canOperate; 
    private Point location; 
    // getters and methods as appropriate 
    public boolean isOpen() { ... 
    ...  
} 

// custom renderer 
Component getListCellRendererComponent(....) { 
    // normal config, assuming you subclass DefaultListCellRender 
    super.getListCellRendererComponent(...) 
    if (value instanceof Valve) { 
     configFromValve((Valve) value) 
    } 
    return this; 
} 
private void configFromValve(Valve valve) { 
    setText("P: (" + valve.location().x + "," + valve.getLocation().y + ")"); 
    setIcon(valve.isOpen() ? openIcon : closedIcon); 
    setEnabled(valve.canOperate()); 
} 
+0

나는 당신의 구현을 많이 좋아한다. 그러나 콤보 모델의 구성 요소로 구성 요소를 정의하는 것은 무엇이 잘못된 것일까? – Brad

+1

@brad 실수로 필요한 속성을 가진 객체를 가지고있는 kludge로 잘못하는 것은 잘못입니다. 구성 요소가 비즈니스 객체 (비주얼 빌더에서 f.i 일 수 있음) 인 경우에도 괜찮 으면 좋겠지 만 이는 매우 드뭅니다. – kleopatra

관련 문제