2013-02-17 2 views
6

Как я могу извлечь компонент из JList с местом щелчка?Получить компонент из JList по адресу щелчка

У меня есть свой собственный рендеринг со списком ячеек, где я вставляю некоторые панели и метки. Теперь я хочу получить, например. ярлык, на который пользователь нажал.

Я попробовал метод list.getComponentAt(evt.getPoint());, но он возвращает только все JList.

+0

Для 'JList', добавьте [' ListSelectionListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionListener.html). Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+3

'JList' не содержит никаких компонентов. Он использует «ListCellRenderer» для рисования «резиновой маркировки» компонента в списке. То есть каждый элемент в списке визуализируется с использованием того же/единственного 'ListCellRenderer' – MadProgrammer

ответ

17

Я не проверял это, но основа будет ...

  1. Используйте JList#locationToIndex(Point), чтобы получить индекс элемента в данной точки.
  2. Получите «элемент» по указанному индексу (используя JList#getModel#getElementAt(int)).
  3. Получите ListCellRenderer используя JList#getCellRenderer.
  4. рендер элемента и получить его Component представления
  5. Установить границы Отображателя на требуемых пределы ячейки
  6. Преобразования оригинала Point к Component сек контексту
  7. Использования getComponentAt на визуализаторе ...

Возможно, что-то вроде ...

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); 
2

Работа MadProgrammer прекрасна, пока пользователь не нажимает на ячейку. Если он это сделает, индекс, возвращаемый locationToIndex(), будет последней ячейкой индекса, поэтому преобразованная точка будет «под» обработанным компонентом

Чтобы проверить, действительно ли пользователь нажал на ячейку, вы должны:

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

. Это решило проблему, с которой я столкнулся, когда всякий раз, когда я нажимал ниже элементов списка, она всегда получала последний компонент. – TraderJosh

Смежные вопросы