2012-09-11 41 views
3

得到COMPONENT(不是數據)我通過它傳遞數據的陣列如何在指數n的JList的

public class MyJList extends JList() { 
... 

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

我渲染使用了ListCellRenderer這個名單,它爲我提供了一個組件爲每個項目創建一個JList ,可以根據buisness邏輯啓用或禁用。

問題是當我試圖通過鍵盤箭頭鍵導航。我希望跳過禁用的項目。 (在適當的方向前進到下一個)我必須使用KeyboardListener,因爲UI會根據列表上選擇的項目更改一些內容。麻煩的是,在鍵盤監聽器中,我無法獲得具有所選索引的項目的COMPONENT。該組件不屬於JList,並且調用MyJList.getComponent(index)失敗並出現ArrayIndexOutOfBoundsException。 1的索引太大,儘管我可以看到七個項目,其中四個已啓用。

我如何編程retreive通過指數的成分從我的JList,以確定它是否啓用?似乎返回Component的唯一接口是getListCellRendererComponent() - 它更改組件的顯示。我只想獲取組件以查看它是否已啓用。

+0

爲了更好地幫助越早,張貼[SSCCE](http://sscce.org/)。 –

+2

您可能會發現[這](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

true,但對_want禁用的項目沒有幫助跳過_ – kleopatra

+1

@kleopatra,但它回答「我如何通過編號從我的JList索引中檢索組件,以確定它是否已啓用?問題的一部分。我不知道如何處理跳過的部分...用你自己的替換相關的動作或調整選擇模型想起來,但似乎都像一個醜陋的黑客 – Robin

+0

公平的,以避免了困難的部分:-)咧嘴笑,當然,這很難,選擇模型路線是可行的,但不是很好。可能需要退後一步來檢查列表是否是小部件的正確選擇。 – kleopatra