Double-click event on JList element
Asked Answered
A

3

81

I have a JList with a DefaultListModel.

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

Adalbertoadalheid answered 3/12, 2010 at 10:36 Comment(0)
F
153
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());
        }
    }
});
Floating answered 3/12, 2010 at 10:45 Comment(3)
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()); }Lightfingered
Wouldn't it be enough to ask the JList for the currently selected item, instead of using locationToIndex? i.e. simply call list.getSelectedIndex().Absher
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)Breakfast
T
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);
    }
}
Termagant answered 18/3, 2015 at 8:28 Comment(0)
T
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);

The code for the ListAction is:

import java.awt.event.*;
import javax.swing.*;

/*
 *  Add an Action to a JList that can be invoked either by using
 *  the keyboard or a mouse.
 *
 *  By default the Enter will will be used to invoke the Action
 *  from the keyboard although you can specify and KeyStroke you wish.
 *
 *  A double click with the mouse will invoke the same Action.
 *
 *  The Action can be reset at any time.
 */
public class ListAction implements MouseListener
{
    private static final KeyStroke ENTER = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);

    private JList list;
    private KeyStroke keyStroke;

    /*
     *  Add an Action to the JList bound by the default KeyStroke
     */
    public ListAction(JList list, Action action)
    {
        this(list, action, ENTER);
    }

    /*
     *  Add an Action to the JList bound by the specified KeyStroke
     */
    public ListAction(JList list, Action action, KeyStroke keyStroke)
    {
        this.list = list;
        this.keyStroke = keyStroke;

        //  Add the KeyStroke to the InputMap

        InputMap im = list.getInputMap();
        im.put(keyStroke, keyStroke);

        //  Add the Action to the ActionMap

        setAction( action );

        //  Handle mouse double click

        list.addMouseListener( this );
    }

    /*
     *  Add the Action to the ActionMap
     */
    public void setAction(Action action)
    {
        list.getActionMap().put(keyStroke, action);
    }

    //  Implement MouseListener interface

    public void mouseClicked(MouseEvent e)
    {
        if (e.getClickCount() == 2)
        {
            Action action = list.getActionMap().get(keyStroke);

            if (action != null)
            {
                ActionEvent event = new ActionEvent(
                    list,
                    ActionEvent.ACTION_PERFORMED,
                    "");
                action.actionPerformed(event);
            }
        }
    }

    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void mousePressed(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}
}
Tibiotarsus answered 3/12, 2010 at 16:34 Comment(3)
Is that solution still valid? The code for the ListAction seems no more accessible.Corder
@HiranChaudhuri, The link still works for me. However, I copied the code for the ListAction into the answer. i would still always try to download the code from the link as it will always contain the most recent code if changes are ever made.Tibiotarsus
Well, camick.com/java/source/ListAction.java delivers an empty page for me. But thanks for copying. :-)Corder

© 2022 - 2024 — McMap. All rights reserved.