Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从JList获取索引n处的组件(非数据)_Java_Swing_Jlist_Jcomponent_Listselectionlistener - Fatal编程技术网

Java 如何从JList获取索引n处的组件(非数据)

Java 如何从JList获取索引n处的组件(非数据),java,swing,jlist,jcomponent,listselectionlistener,Java,Swing,Jlist,Jcomponent,Listselectionlistener,我通过向它传递一个数据数组来创建一个JList public class MyJList extends JList() { ... public MyJList(final Object[] listData) { super[listData]; } 我使用ListCellRenderer呈现这个列表,它为每个项目提供了一个组件,可以根据业务逻辑启用或禁用该组件 当我试图通过键盘箭头导航时,问题就出现了。我希望跳过禁用的项目。(转到适当方向的下一个)我必须使用键

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

public class MyJList extends JList() {
...

   public MyJList(final Object[] listData) {
       super[listData];
   }
我使用ListCellRenderer呈现这个列表,它为每个项目提供了一个组件,可以根据业务逻辑启用或禁用该组件

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


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

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

您可以在中找到所有这些解释。虽然对表进行了解释,但它也适用于
JList
s

如果您想获得某个索引的“组件”,只需使用渲染器并向其请求组件即可。这方面的一个例子可以在
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();
}
公共字符串GetToolTiptText(MouseeEvent事件){
如果(事件!=null){
p点=event.getPoint();
int指数=位置指数(p);

ListCellRenderTrue,但在需要禁用项时不起作用skipped@kleopatra但它回答了“如何通过编程从JList按索引检索组件以确定其是否已启用?”问题的一部分。我不知道如何处理跳过的部分…用你自己的操作替换相关操作或调整选择模型,但这两种方法看起来都很丑陋,足以忽略难处理的部分:-)咧嘴笑,当然,这很难,选择模型路线可行,但不是很好。可能需要退一步到查看列表是否是小部件的正确选择。答案是您无法获取组件。一旦我理解了这一点,我意识到我实际上不需要获取组件。我可以简单地维护一个与列表中的每个项目对应的布尔数组,并使用它来实现组件,而不是试图设置组件的启用成员“已跳过禁用项目”功能。若要更快获得更好的帮助,请发布一个。您可能会发现答案很有用。它通过覆盖
ListSelectionModel
中的
setSelectionInterval
,正好满足您的需要。