5

我通过传递一个数据数组来创建一个 JList

public class MyJList extends JList() {
...

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

我使用 ListCellRenderer 呈现此列表,它为每个项目提供了一个组件,可以根据业务逻辑启用或禁用它。

当我尝试通过键盘箭头导航时,问题就来了。我希望跳过禁用的项目。(在适当的方向继续下一个)我必须使用键盘监听器,因为 UI 会根据列表中选择的项目更改一些内容。麻烦的是,在键盘侦听器中,我无法获得具有所选索引的项目的 COMPONENT。此组件不属于 JList,调用 MyJList.getComponent(index) 失败并出现 ArrayIndexOutOfBoundsException。1 是一个太大的索引,尽管我可以看到七个项目,其中四个是启用的。

如何以编程方式从我的 JList 中按索引检索组件以确定它是否已启用?似乎返回组件的唯一接口是 getListCellRendererComponent() - 它会更改组件的显示。我只想让组件查看它是否已启用。

4

1 回答 1

6

JList不包含任何组件。渲染器返回的组件仅用作标记,但实际上并未包含在JList.

您可以在表格教程的“渲染器和编辑器”部分找到所有这些解释。虽然它是针对表进行解释的,但它也适用于JLists。

如果你想获取某个索引的“组件”,你只需要使用渲染器并要求它提供一个组件。这方面的一个例子可以在源代码中看到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();
}
于 2012-09-11T20:55:05.080 回答