如何从JList获取索引n处的COMPONENT(不是数据)

Ste*_*hen 5 java swing jcomponent jlist listselectionlistener

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

public class MyJList extends JList() {
...

   public MyJList(final Object[] listData) {
       super[listData];
   }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rob*_*bin 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();
}
Run Code Online (Sandbox Code Playgroud)