2012-09-11 2 views
3

인덱스 N에서 COMPONENT (되지 않은 데이터)를 얻기 위해 어떻게 그것을 각 항목에 대해 나에게 구성 요소를 제공합니다 나는의 ListCellRenderer를 사용하여이 목록을 렌더링는 JList의

public class MyJList extends JList() { 
... 

    public MyJList(final Object[] listData) { 
     super[listData]; 
    } 

데이터의 배열을 전달하여하는 JList를 만들 이는 영업 논리에 따라 활성화 또는 비활성화 될 수 있습니다.

키보드 화살표로 탐색하려고하면 문제가 발생합니다. 비활성화 된 항목을 건너 뛰고 싶습니다. (적절한 방향으로 다음 항목으로 이동) 목록에서 선택된 항목에 따라 UI가 일부 항목을 변경하기 때문에 KeyboardListener를 사용해야합니다. 문제는 키보드 수신기에서 선택한 색인이있는 항목의 구성 요소를 가져올 수 없다는 것입니다. 이 Component는 JList가 소유하고 있지 않습니다. MyList.getComponent (index)를 호출하면 (자) ArrayIndexOutOfBoundsException가 발생 해 실패합니다. 1은 7 개의 항목을 볼 수 있지만 4 개의 항목이 활성화되어 있어도 너무 큰 색인입니다.

JList의 인덱스를 사용하여 구성 요소를 프로그래밍 방식으로 검색하여 활성화되어 있는지 확인할 수 있습니까? Component를 반환하는 것으로 보이는 유일한 인터페이스는 getListCellRendererComponent()입니다.이 인터페이스는 구성 요소의 표시를 변경합니다. 난 단지 구성 요소가 활성화되었는지 확인하려고합니다.

+0

더 빨리 도움 들어 [SSCCE (http://sscce.org/)를 작성. –

+2

[this] (http://stackoverflow.com/a/8344497/1048330) 대답이 유용 할 수 있습니다. 'ListSelectionModel'에서'setSelectionInterval'을 오버 라이딩함으로써 여러분이 필요로하는 것을 정확하게 수행합니다. – tenorsax

답변

5

JList에는 구성 요소가 없습니다. 렌더러에 의해 반환 된 구성 요소는 스탬프로만 사용되지만 실제로는 JList에 포함되지 않습니다.

이 모든 내용은 "Renderers and Editors" section of the Table tutorial에서 확인할 수 있습니다. 테이블에 대해서는 설명되어 있지만, JList에도 적용됩니다.

특정 색인에 대해 "구성 요소"를 얻으려면 렌더러를 사용하여 구성 요소를 요청하면됩니다. 이러한 예는 JList#getTooltipText의 소스 코드에서 알 수

public String getToolTipText(MouseEvent event) { 
    if(event != null) { 
     Point p = event.getPoint(); 
     int index = locationToIndex(p); 
     ListCellRenderer<? super E> r = getCellRenderer(); 
     Rectangle cellBounds; 

     if (index != -1 && r != null && (cellBounds = 
          getCellBounds(index, index)) != null && 
          cellBounds.contains(p.x, p.y)) { 
      ListSelectionModel lsm = getSelectionModel(); 
      Component rComponent = r.getListCellRendererComponent(
         this, getModel().getElementAt(index), index, 
         lsm.isSelectedIndex(index), 
         (hasFocus() && (lsm.getLeadSelectionIndex() == 
             index))); 

      if(rComponent instanceof JComponent) { 
       MouseEvent  newEvent; 

       p.translate(-cellBounds.x, -cellBounds.y); 
       newEvent = new MouseEvent(rComponent, event.getID(), 
              event.getWhen(), 
              event.getModifiers(), 
              p.x, p.y, 
              event.getXOnScreen(), 
              event.getYOnScreen(), 
              event.getClickCount(), 
              event.isPopupTrigger(), 
              MouseEvent.NOBUTTON); 

       String tip = ((JComponent)rComponent).getToolTipText(
              newEvent); 

       if (tip != null) { 
        return tip; 
       } 
      } 
     } 
    } 
    return super.getToolTipText(); 
} 
+0

사실이지만 _want가 비활성화 된 항목에서 도움을받지 못함 – kleopatra

+1

@kleopatra하지만 "프로그램이 사용 가능 여부를 결정하기 위해 JList의 색인을 사용하여 구성 요소를 검색 할 수 있습니까?" 질문의 일부. 나는 건너 뛴 부분을 다루는 방법을 모르겠다 ... 관련 작업을 직접 바꾸거나 선택 모델을 마음에 맞게 조정할 수 있지만 추한 해킹처럼 보일 수도 있습니다. – Robin

+0

어려운 부분을 제외하고 충분히 공정하게 :-) 웃음, 물론, 어렵지는 않습니다. selectionModel 라우트는 실행 가능하지만 그렇게 좋지는 않습니다. 목록이 위젯의 ​​올바른 선택인지 검토하기 위해 아마도 단계별 조치가 필요합니다. – kleopatra

관련 문제