2013-02-17 26 views
6

Bir bileşeni, JList adresinden tıklama konumu ile nasıl getirebilirim?JList öğesinden bir bileşene tıklayın Konum

Bazı panelleri ve etiketleri eklediğim kendi liste hücresi oluşturucum var. Şimdi, ör. Kullanıcının tıkladığı etiket.

list.getComponentAt(evt.getPoint()); yöntemini denedim, ancak yalnızca JList öğesinin tamamını döndürür.

+0

, bir [ 'ListSelectionListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionListener.html) ekleyin. Daha iyi yardım için, bir [SSCCE] (http://sscce.org/) gönderin. –

+3

'JList' herhangi bir bileşeni kaplamıyor. Bileşenin listeye bir "lastik damgası" boyamak için 'ListCellRenderer 'kullanır. Yani, listedeki her öğe aynı/tek 'ListCellRenderer' kullanılarak oluşturulmaktadır. – MadProgrammer

cevap

17

bu test değil, ama temelleri olurdu ...

  1. Kullanım JList#locationToIndex(Point) verilen noktasında öğenin dizinini alır.
  2. Belirtilen dizinden "öğe" değerini alın ( JList#getModel#getElementAt(int) kullanarak).
  3. ListCellRenderer ürününü JList#getCellRenderer kullanarak edinin.
  4. elemanı Render ve gerekli hücre sınırları için oluşturucunuz en sınırlarını ayarlayın Component temsil
  5. var olsun
  6. dönüştürme Component s bağlamda oluşturucuda
  7. Kullanım getComponentAt orijinal Point ...
Muhtemelen

, gibi bir şey ...

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, kullanıcının bir hücrenin dışına tıklamadığı sürece iyi çalışır. Bunu yaparsa, locationToIndex() tarafından döndürülen dizin son dizinin hücresi olacaktır, bu nedenle dönüştürülen nokta işlenen bileşenin "altında" olacaktır.

Kullanıcının gerçekten bir hücreyi tıklatıp tıkamadığını kontrol etmek için:

bir 'JList` için
int index = list.locationToIndex(p); 
if (index > -1 && list.getCellBounds(index, index).contains(p)){ 
    // rest of MadProgrammer solution 
    ... 
} 
+0

Bu, liste öğelerinin altında her tıklattığımda, her zaman son bileşeni alacağım sorunu çözdü. – TraderJosh