Does JList
ever fire KeyEvent
s? Doesn’t seem so. Here’s an MRE
package demos.list;
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class JListDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("JList Demo");
JPanel mainPanel = new JPanel();
mainPanel.add(createList());
frame.setContentPane(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private static JList<String> createList() {
JList<String> list = new JList<>(createListModel());
list.addKeyListener(createListKeyListener());
return list;
}
private static KeyListener createListKeyListener() {
return new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("Key typed");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Key pressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("Key released");
}
};
}
private static ListModel<String> createListModel() {
DefaultListModel<String> listModel = new DefaultListModel<>();
listModel.addElement("Pen");
listModel.addElement("Pencil");
listModel.addElement("Eraser");
return listModel;
}
}
No logs are ever printed, no matter how hard you hit the keyboard
The reason I want to listen to KeyEvent
s instead of ListSelectionEvent
s is I need to act (hide the containing JPopupMenu
) even if the user selects the item that was already selected. I don’t get any ListSelectionEvent
s if that happens