Double-click event on JList element
I have a JList
with a DefaultListModel
.
How I can m开发者_如何学Pythonake an item in a JList
react to double-click event?
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());
}
}
});
(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);
}
}
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) {}
}
精彩评论