Les clés KeyListener et plusieurs Swing pressées en même temps
-
26-09-2019 - |
Question
est-il un moyen classique bat de traquer les événements, lorsque deux touches du clavier sont enfoncées en même temps? J'ai deux ou trois idées par exemple se rappelant le temps de génération de clés et l'événement afin que nous puissions dans un appel de gestionnaire d'événements consécutifs vérifiez la différence de temps entre ces deux événements et décider, que ce soit un événement à deux boutons ou non. Mais il ressemble à une bidouille.
La solution
Utiliser une collection de se rappeler quelles touches sont actuellement pressés et vérifiez si plus d'une touche est enfoncée à chaque fois qu'une touche est enfoncée.
class MultiKeyPressListener implements KeyListener {
// Set of currently pressed keys
private final Set<Character> pressed = new HashSet<Character>();
@Override
public synchronized void keyPressed(KeyEvent e) {
pressed.add(e.getKeyChar());
if (pressed.size() > 1) {
// More than one key is currently pressed.
// Iterate over pressed to get the keys.
}
}
@Override
public synchronized void keyReleased(KeyEvent e) {
pressed.remove(e.getKeyChar());
}
@Override
public void keyTyped(KeyEvent e) {/* Not used */ }
}
Autres conseils
L'interface KeyListener permet de détecter clé appuyant et en relâchant séparément. Par conséquent, vous pouvez maintenir un ensemble de « touches actives », à savoir les touches qui ont été pressées, mais non encore publié.
Si au bout de 7 ans, j'ai essayé de le faire (juste pour voir s'il est possible), quelqu'un d'autre pourrait tout aussi bien ...
Le code ci-dessous contrôle le mouvement avec la direction 8 axes, explication dans les commentaires. Mais au fond, la KeyListener
définir exactement là où il est possible de déplacer, puis un Thread
combinera les destinations possibles et déplacer le JLabel
.
package tests;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Move8Axis extends JFrame {
private static final long serialVersionUID = 7722803326073073681L;
private boolean left = false;
private boolean up = false;
private boolean down = false;
private boolean right = false;
private JLabel lbl = new JLabel("#");
public Move8Axis() {
// Just setting up the window and objects
setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
lbl.setBounds(100, 100, 20, 20);
add(lbl);
setLocationRelativeTo(null);
// Key listener, will not move the JLabel, just set where to
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) left = false;
if (e.getKeyCode() == KeyEvent.VK_RIGHT) right = false;
if (e.getKeyCode() == KeyEvent.VK_UP) up = false;
if (e.getKeyCode() == KeyEvent.VK_DOWN) down = false;
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) left = true;
if (e.getKeyCode() == KeyEvent.VK_RIGHT) right = true;
if (e.getKeyCode() == KeyEvent.VK_UP) up = true;
if (e.getKeyCode() == KeyEvent.VK_DOWN) down = true;
}
});
// This thread will read the 4 variables left/right/up/down at every 30 milliseconds
// It will check the combination of keys (left and up, right and down, just left, just up...)
// And move the label 3 pixels
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
if (left && up) {
lbl.setBounds(lbl.getX() - 3, lbl.getY() - 3, 20, 20);
} else if (left && down) {
lbl.setBounds(lbl.getX() - 3, lbl.getY() + 3, 20, 20);
} else if (right && up) {
lbl.setBounds(lbl.getX() + 3, lbl.getY() - 3, 20, 20);
} else if (right && down) {
lbl.setBounds(lbl.getX() + 3, lbl.getY() + 3, 20, 20);
} else if (left) {
lbl.setBounds(lbl.getX() - 3, lbl.getY(), 20, 20);
} else if (up) {
lbl.setBounds(lbl.getX(), lbl.getY() - 3, 20, 20);
} else if (right) {
lbl.setBounds(lbl.getX() + 3, lbl.getY(), 20, 20);
} else if (down) {
lbl.setBounds(lbl.getX(), lbl.getY() + 3, 20, 20);
}
Thread.sleep(30);
}
} catch (Exception ex) {
ex.printStackTrace();
System.exit(0);
}
}
}).start();
}
public static void main(String[] args) {
new Move8Axis();
}
}