How do I detect the combination key Shift+Tab in a JTextField?
-
1possible duplicate of [How can a KeyListener detect key combinations (e.g., ALT + 1 + 1)](http://stackoverflow.com/questions/7851505/how-can-a-keylistener-detect-key-combinations-e-g-alt-1-1) – jmj Dec 16 '11 at 13:38
3 Answers
is this what you want?
javax.swing.JTextField textField = new javax.swing.JTextField();
textField.setFocusTraversalKeysEnabled(false);
javax.swing.Action myAction = new javax.swing.AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
//Insert arbitrary code here
}
};
textField.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, Event.SHIFT_MASK), "myCode");
textField.getActionMap().put("myCode", myAction);
- 30,724
- 51
- 192
- 308
-
not use KeyListener this is wrong way, Swing JComponents are designated to use KeyBinding, only KeyBindings can override built-in key-shortcuts, only KeyBindings wokrs as you set, only KeyBindings ignore when JComponents has Fosus, or doesn't ignore, as you set – mKorbel Dec 17 '11 at 09:44
-
This is a bit of a special case since Shift+Tab is a focus traversal key. The focus subsystem normally consumes focus traversal keys, so you'll need to prevent that by calling
component.setFocusTraversalKeysEnabled(false);
on your JTextField. You'll then be able to detect the Shift+Tab combination and handle it yourself.
See How to Write a Key Listener for an example program you can download and experiment with to see how it works.
- 3,284
- 6
- 47
- 64
- 398,270
- 210
- 566
- 880
-
2+1, for turning off forcus traversal. -1, for suggesting a KeyListener. Don't use a KeyListener. Swing was designed to use Key Binding. Read the section from the same tutorial on "How to Use Key Bindings". – camickr Dec 16 '11 at 16:52
Tab and Shift+Tab is only/by default (only KeyBinding can change that) about moving Focus from one JComponent to another, I think that you have to look at FocusListener with detailed descriptions in the FocusSubsystem, notice Focus came from Native OS and is by default asynchronous, most of time required delaying their actions/events wrapped into invokeLater()