77

I have a JList with a DefaultListModel.

How I can make an item in a JList react to double-click event?

APerson
  • 7,746
  • 8
  • 34
  • 48
Lobo
  • 3,863
  • 8
  • 35
  • 64

3 Answers3

149
String[] items = {"A", "B", "C", "D"};
JList list = new JList(items);

list.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent evt) {
        JList list = (JList)evt.getSource();
        if (evt.getClickCount() == 2) {

            // Double-click detected
            int index = list.locationToIndex(evt.getPoint());
        } else if (evt.getClickCount() == 3) {

            // Triple-click detected
            int index = list.locationToIndex(evt.getPoint());
        }
    }
});
APerson
  • 7,746
  • 8
  • 34
  • 48
Mohamed Saligh
  • 11,650
  • 18
  • 63
  • 83
  • 26
    Note that if the list has empty space, and a user double clicks on the empty space, this will detect a double click on the last object in the list. If you want to only detect clicks in the area of the list that contains items, you can check like this: Rectangle r = list.getCellBounds(0, list.getLastVisibleIndex()); if (r != null && r.contains(evt.getPoint())) { int index = list.locationToIndex(evt.getPoint()); } – Jeremy Brooks Mar 01 '12 at 23:14
  • 17
    Wouldn't it be enough to ask the JList for the currently selected item, instead of using locationToIndex? i.e. simply call list.getSelectedIndex(). –  Sep 14 '12 at 09:19
  • 4
    This example will trigger with multiple clicks on **any** mouse button. If you only care about the first button, you will also want to check `if (evt.getButton() == MouseEvent.BUTTON1)` – Yoshiya Oct 20 '16 at 13:31
12

(based on Mohamed Saligh, the accepted response)

If you are using NetBeans

Select the JList > Events window > mouseClicked

private void jListNicknamesMouseClicked(java.awt.event.MouseEvent evt) {                                            
    JList list = (JList)evt.getSource();
    if (evt.getClickCount() == 2) {
        int index = list.locationToIndex(evt.getPoint());
        System.out.println("index: "+index);
    }
}
SandroMarques
  • 5,029
  • 39
  • 40
11

I know you have a simple solution, but you may want to check out List Action for a more general solution that will allow you to use the mouse as well as the key board. Proper GUI design should allow the use to use either approach.

The most basic example of using the ListAction would be:

String[] data = { "zero", "one", "two", "three", "four", "five" };
JList list = new JList( data );

Action displayAction = new AbstractAction()
{
    public void actionPerformed(ActionEvent e)
    {
        JList list = (JList)e.getSource();
        System.out.println(list.getSelectedValue());
    }
};

ListAction la = new ListAction(list, displayAction);
camickr
  • 316,400
  • 19
  • 155
  • 279