2008-10-09 11 views
0

다음 ListCellRenderer는 중첩 된 ComboBox에서 클릭 이벤트를받지 않습니다. 나는 무엇인가를 사용해야합니까?ListCellRenderer가 하위 구성 요소의 이벤트를 실행하지 않음

class FilterCellRenderer implements ListCellRenderer { 

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     Filter filter = (Filter)value; 

     JPanel filterPanel = new JPanel(); 
     FlowLayout layout = new FlowLayout(); 
     layout.setAlignment(FlowLayout.LEFT); 
     filterPanel.setLayout(layout); 
     filterPanel.add(new JLabel(filter.getLabel())); 

     final List<Object> options = filter.getOptions(); 
     if (options.size() > 1) { 
      JComboBox optionCombo = new JComboBox(new AbstractComboBoxModel() { 

       public int getSize() { 
        return options.size(); 
       } 

       public Object getElementAt(int index) { 
        return options.get(index); 
       } 
      }); 
      optionCombo.setSelectedItem(filter.getValue()); 
      filterPanel.add(optionCombo); 
     } 

     if (isSelected) { 
      filterPanel.setBackground(list.getSelectionBackground()); 
      filterPanel.setForeground(list.getSelectionForeground()); 
     } 
     return filterPanel; 
    } 

} 

답변

0

다소 까다 롭습니다. JList를 단일 열 JTable로 대체해야한다고 생각합니다. 그런 다음 표 셀 편집기와 렌더러를 설정하십시오. IIRC에서 첫 번째 클릭을 잃는 데 문제가있을 수 있습니다 (이 셀은 편집 된 셀을 선택하는 데 사용됩니다).

또한 getCellRendererComponent를 호출 할 때마다 컴포넌트를 재사용하는 것이 좋습니다. 구성 요소는 스탬프로 사용 된 다음 삭제됩니다. 매번 재생성하면 성능이 크게 빨라집니다.

1

"고무 도장"과 같은 스윙 작업의 렌더러 구성 요소는 값을 렌더링/페인트하는 데 사용되며 일반적인 방법으로 상위 컨테이너에 추가되지 않습니다 (단 하나의 구성 요소를 여러 위치에 추가하는 방법을 생각해보십시오). !).

렌더러가 아닌 편집기가 필요할 수도 있습니다 (편집기는 특정 시점에 한 곳에서 추가 된 완전한 기능의 구성 요소입니다). 대신 JList에 MouseListener를 설치해야합니다.

1

행을 선택할 필요가 없기 때문에 사용자 정의 레이아웃이있는 JPanel에 요소를 동적으로 추가하고 요소를 추가했습니다. 테이블을 해킹하지 않고도 전체 구성 요소 동작을 허용합니다.

관련 문제