在 JList 元素上双击事件

我有一个 JList和一个 DefaultListModel

如何使 JList中的项目对双击事件作出反应?

80521 次浏览
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());
}
}
});

我知道您有一个简单的解决方案,但是您可能想查看 列表行动以获得一个更通用的解决方案,该解决方案允许您使用鼠标和键盘。正确的 GUI 设计应该允许使用任何一种方法。

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

ListAction的代码是:

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) {}
}

(根据默罕默德 · 萨利格,公认的回应)

如果您正在使用 NetBeans

选择 JList > Events 窗口 > mouseClicks

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