2013-02-17 6 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. ListCellRendererJList#getCellRendererとしてください。
  4. 要素をレンダリングし、それが必要なセルの境界にレンダラの境界を設定しComponent表現
  5. のget
  6. 変換Componentのコンテキストレンダラの
  7. 使用getComponentAtに元Point ...

...

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