How Can a Keylistener Detect Key Combinations (E.G., Alt + 1 + 1)

How can a KeyListener detect key combinations (e.g., ALT + 1 + 1)

You should not use KeyListener for this type of interaction. Instead use key bindings, which you can read about in the Java Tutorial. Then you can use the InputEvent mask to represent when the various modifier keys are depresed. For example:

// Component that you want listening to your key
JComponent component = ...;
component.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
java.awt.event.InputEvent.CTRL_DOWN_MASK),
"actionMapKey");
component.getActionMap().put("actionMapKey",
someAction);

See the javadoc for KeyStroke for the different codes you can use while getting the KeyStroke. These modifiers can be OR'ed together to represent various combinations of keys. Such as

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
java.awt.event.InputEvent.CTRL_DOWN_MASK
| java.awt.event.InputEvent.SHIFT_DOWN_MASK)

To represent when the Ctrl + Shift keys were depressed.

Edit: As has been pointed out, this does not answer you question but instead should just be taken as some good advice.

Get key combinations

@Override
public void keyPressed(KeyEvent evt) {
if (evt.getKeyCode()==KeyEvent.VK_CONTROL) { ctrl = true; }
else if (evt.getKeyCode()==KeyEvent.VK_SHIFT) { shift = true; }
else if (evt.getKeyCode()==KeyEvent.VK_ALT) { alt = true; }
else {
keyHit = KeyEvent.getKeyText( evt.getKeyCode() );
System.out.println("Key Hit is "+keyHit);
}

processLocalKeyEvent(evt);
}

@Override
public void keyReleased(KeyEvent evt) {

if (evt.isControlDown() && keyHit != "") ctrl = true;
if (evt.isAltDown() && keyHit != "") alt = true;
if (evt.isShiftDown() && keyHit != "") shift = true;

if (ctrl) sb.append("Ctrl");
if (shift) sb.append("Shift");
if (alt) sb.append("Alt");
if (!ctrl && !shift && !alt) {
sb.append(keyHit);
} else {
sb.append("_"+keyHit);
}

if (ctrl || shift || alt) {
Thread thread = new Thread();
try {
thread.sleep(300);
rfbProto.capture();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if ((ctrl || shift || alt) && keyHit=="") {
rfbProto.capture();
} else if ((!ctrl || !shift || !alt) && keyHit!="") {
rfbProto.capture();
}

ctrl = false;
shift = false;
alt = false;
keyHit = "";
sb = new StringBuffer();
processLocalKeyEvent(evt);
}

Java detect CTRL+X key combination on a jtree

You can add KeyListeners to any component (f)

        f.addKeyListener(new KeyListener() {

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
System.out.println("woot!");
}
}

@Override
public void keyReleased(KeyEvent e) {
}
});

Detect combination key in JTextField?

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.

Multiple Keys in KeyEvent Listener

To be honest, KeyListener has many limitations and is cumbersome to use (IMHO), instead, I would simply take advantage of the key bindings API, which generally provides you with a greater deal of flexibility and potentional for resuse.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class KeyListenerTest {

public static void main(String[] args) {
new KeyListenerTest();
}

public KeyListenerTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private JLabel lbl;
private boolean fullScreen = false;

public TestPane() {
lbl = new JLabel("Normal");
setLayout(new GridBagLayout());
add(lbl);

InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_DOWN_MASK), "FullScreen");
am.put("FullScreen", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (fullScreen) {
lbl.setText("Normal");
} else {
lbl.setText("Full Screen");
}
fullScreen = !fullScreen;
}
});

}

}

}

And just so you don't think I'm completely bias, here's an example using KeyListener...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class KeyListenerTest {

public static void main(String[] args) {
new KeyListenerTest();
}

public KeyListenerTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private JLabel lbl;
private boolean fullScreen = false;

public TestPane() {
lbl = new JLabel("Normal");
setLayout(new GridBagLayout());
add(lbl);

setFocusable(true);
addMouseListener(new MouseAdapter() {

@Override
public void mouseClicked(MouseEvent e) {
requestFocusInWindow();
}

});

addKeyListener(new KeyAdapter() {

@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_F && e.isControlDown()) {
if (fullScreen) {
lbl.setText("Normal");
} else {
lbl.setText("Full Screen");
}
fullScreen = !fullScreen;
}
}

});
}
}
}

Can't get Windows Forms Key combinations if one of the Keys is Alt, Control, or Shift

The KeyData property exposes the key that was pressed as well as the modifiers that are active. So you'd use it like this:

private void Form1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyData == (Keys.Shift | Keys.W) || e.KeyData == (Keys.Shift | Keys.S)) {
Console.WriteLine("combination");
}
}

You can do it your way as well, but then you have to use a different property, KeyCode. It exposes only the key code without the modifier keys:

private void Form1_KeyDown(object sender, KeyEventArgs e) {
if (e.Shift) {
Console.WriteLine("shift");
if (e.KeyCode == Keys.W || e.KeyCode == Keys.S) {
Console.WriteLine("combination");
}
}
}

Which one you'd use is entirely up to you. Do however keep in mind that using the form's KeyDown event is not very correct. It also requires setting the KeyPreview property to true. That's a pretty ugly VB6 compatibility property, you cannot see every possible keystroke. The navigation keys are filtered, like it was done in VB6. The native Winforms way is to override the ProcessCmdKey() method instead. Which does require you to work with KeyData.

Java-KeyListener: How to fire Events?

Don't call the movement method inside the keypress method, instead whenever you call the updates in your gameloop also call an update method in your inputlistener that checks which keys have been pressed, this will allow you to have multiple keypresses at the same time, keypresses that will be set to false once the key is released, like so:

In your inputhandler:

public void update() {

if (up == true) {
SomeMethod(Key.UP);
}
if (down == true) {
SomeMethod(Key.DOWN);
}
if (left == true) {
someMethod(Key.LEFT);
}
if (right == true) {
someMethod(Key.RIGHT);
}

}
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_S:
down = false;
break;
case KeyEvent.VK_W:
up = false;
break;
case KeyEvent.VK_A:
left = false;
break;
case KeyEvent.VK_D:
right = false;
break;
}
}

public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_S:
down = true;
break;
case KeyEvent.VK_W:
up = true;
break;
case KeyEvent.VK_A:
left = true;
break;
case KeyEvent.VK_D:
right = true;
break;


Related Topics



Leave a reply



Submit