通过单击位置从JList获取组件

时间:2013-02-17 23:18:59

标签: java swing location selection jlist

如何通过点击位置从JList获取组件?

我有自己的列表单元格渲染器,我插入了一些面板和标签。 现在我想得到,例如用户点击的标签。

我尝试了list.getComponentAt(evt.getPoint());方法,但它只返回整个JList

2 个答案:

答案 0 :(得分:18)

我没有测试过这个,但基础知识是...

  1. 使用JList#locationToIndex(Point)获取元素的索引 给定点。
  2. 获取指定索引处的“元素”(使用 JList#getModel#getElementAt(int))。
  3. 使用ListCellRenderer
  4. 获取JList#getCellRenderer
  5. 渲染元素并获取Component表示
  6. 将渲染器的边界设置为所需的单元格范围
  7. 将原始Point转换为Component上下文
  8. 在渲染器上使用getComponentAt ...
  9. 可能就像......

    int index = list.locationToIndex(p);
    Object value = list.getModel().getElementAt(int);
    Component comp = listCellRenderer.getListCellRendererComponent(list, value, index, true, true);
    comp.setBounds(list.getCellBounds(index, index));
    Point contextPoint = SwingUtilities.convertPoint(list, p, comp);
    Component child = comp.getComponentAt(contextPoint);
    

答案 1 :(得分:3)

只要用户没有在单元格外点击,MadProgrammer就可以正常工作。如果他这样做,locationToIndex()返回的索引将是最后一个索引的单元格,因此转换后的点将是"在"渲染的组件

要检查用户是否确实单击了您必须执行的单元格:

int index = list.locationToIndex(p);
if (index > -1 && list.getCellBounds(index, index).contains(p)){
    // rest of MadProgrammer solution
    ...
}