我通过传递一个数据数组
来创建一个JListpublic class MyJList extends JList() {
...
public MyJList(final Object[] listData) {
super[listData];
}
我使用ListCellRenderer渲染此列表,它为每个项目提供了一个组件,可以根据商务逻辑启用或禁用。
当我尝试按键盘箭头导航时出现问题。我希望跳过禁用的项目。 (在适当的方向继续下一个)我必须使用KeyboardListener,因为UI根据列表中选择的项目更改了一些内容。麻烦的是,在键盘监听器中,我无法获得具有所选索引的项目的COMPONENT。此Component不归JList所有,并且调用MyJList.getComponent(index)失败并返回ArrayIndexOutOfBoundsException。 1是一个索引太大,即使我可以看到七个项目,其中四个已启用。
如何以编程方式从我的JList以编程方式检索组件以确定它是否已启用?似乎返回Component的唯一接口是getListCellRendererComponent() - 它会更改组件的显示。我只是想让组件看看它是否已启用。
答案 0 :(得分:6)
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();
}