我正在做一个需要检测是否按下了某个组合键的项目。Ctrl像, Alt, A-Z和0-这样的任何键9都可以用作组合键。
我已经使用搜索了一些代码,KeyStroke.getKeyStroke
但似乎它不允许没有Ctrl, Shift,Alt等的组合。
我的应用程序需要检测组合,即使没有Ctrl或Alt例如只是普通A++的B组合C。这也可以做到KeyStroke.getKeyStroke
吗?非常感谢您的回复。
我正在做一个需要检测是否按下了某个组合键的项目。Ctrl像, Alt, A-Z和0-这样的任何键9都可以用作组合键。
我已经使用搜索了一些代码,KeyStroke.getKeyStroke
但似乎它不允许没有Ctrl, Shift,Alt等的组合。
我的应用程序需要检测组合,即使没有Ctrl或Alt例如只是普通A++的B组合C。这也可以做到KeyStroke.getKeyStroke
吗?非常感谢您的回复。
AFAIK,没有办法获得密钥的状态,这与:
KeyStroke keyStroke = KeyStroke.getKeyStroke("A");
// NOT supported
if (keyStroke.isPressed()) {
// do something
}
唯一支持的是关于单个键状态更改的通知,在 KeyListener 的最低级别
public void keyPressed(KeyEvent e) {
if (KeyEvent.VK_A == e.getKeyCode()) {
....
}
}
要处理组合键(使用特殊修饰键除外),无法跟踪已按下/释放哪些键以了解哪些键处于按下状态。
下面是在 keyBindings 级别上执行此操作的示例。基本成分
一些代码:
// the logic container
public static interface Trigger {
public void addTrigger(String trigger);
public void arm(ActionEvent e);
public void disarm(ActionEvent e);
}
// a particular implementation which uses the actionCommand
// as identifiers
public static class ActionTrigger implements Trigger {
private Action triggered;
private List<String> triggers = new ArrayList<>();
private List<String> armed = new ArrayList<>();
public ActionTrigger(Action triggered) {
this.triggered = triggered;
}
@Override
public void arm(ActionEvent e) {
String command = e.getActionCommand();
if (!triggers.remove(command)) return;
armed.add(command);
if (triggers.isEmpty()) {
triggered.actionPerformed(e);
}
}
@Override
public void disarm(ActionEvent e) {
String command = e.getActionCommand();
if (!armed.remove(command)) return;
triggers.add(command);
}
@Override
public void addTrigger(String trigger) {
triggers.add(trigger);
}
}
// an Action notifying the trigger of dis/arms
public static class ArmingAction extends AbstractAction {
private Trigger trigger;
private boolean arm;
/**
* @param trigger
*/
public ArmingAction(Trigger trigger, String command, boolean arm) {
this.trigger = trigger;
this.arm = arm;
putValue(ACTION_COMMAND_KEY, command);
}
@Override
public void actionPerformed(ActionEvent e) {
if (arm) {
trigger.arm(e);
} else {
trigger.disarm(e);
}
}
}
// usage
// the action to trigger with multiple keys
Action action = new AbstractAction("real") {
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("******triggered: " + e);
}
};
JComponent comp = new JPanel();
ActionMap actionMap = comp.getActionMap();
InputMap inputMap = comp.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Trigger trigger = new ActionTrigger(action);
// the key combination
char[] chars = {'A', 'S', 'D'};
for (int i = 0; i < chars.length; i++) {
// the identifier
String command = "step" + chars[i];
trigger.addTrigger(command);
// binding for pressed
String pressedID = "pressed" + chars[i];
actionMap.put(pressedID, new ArmingAction(trigger, command, true));
inputMap.put(KeyStroke.getKeyStroke("pressed " + chars[i]), pressedID);
// binding for released
String releasedID = "released" + chars[i];
actionMap.put(releasedID, new ArmingAction(trigger, command, false));
inputMap.put(KeyStroke.getKeyStroke("released " + chars[i]), releasedID);
}
comp.add(new JButton("multibindings ... a s d"));
取决于应用程序类型是否有 GUI,对于 GUI 相关的你必须寻找
DocumentListener和KeyBindings,我建议拒绝为复杂的代码和 Focus 解决方法实现KeyListener
或添加addAWTEventListener(AWTEventListener listener, long eventMask)并且也可以监听 KeyEvents 和 MouseEvents
您可以播放 KeyListener 的 keyPressed 和 keyReleased 方法。如果你用你的键盘输入,keyPressed 事件首先发生在 keyReleased 之前。您可以在按键中获取按键事件,并在使用业务逻辑释放的按键中捕获该组合键。
公共无效keyPressed(KeyEvent evt){
keyHit = KeyEvent.getKeyText(evt.getKeyCode());
System.out.println("Key Pressed is "+keyHit);
}
公共无效keyReleased(KeyEvent evt){
stringBuffer.append(keyHit)
System.out.println("Key Released is "+keyHit);
}
我尝试了很多方法,终于找到了一种可以通过任意两个组合键执行的方法。
下面是我的 GUI 项目代码:
Boolean k4 = false;
Boolean k5 = false;
Boolean k6 = false;
Boolean ke = false;
Boolean vs = false;
private void jLabel1KeyPressed(java.awt.event.KeyEvent evt) {
int i = evt.getKeyCode();
switch(i) {
case VK_NUMPAD4 : k4=true; break;
case VK_NUMPAD5 : k5= true; break;
case VK_NUMPAD6 : k6 = true; break;
case VK_ENTER : ke = true; break;
case VK_SUBTRACT: vs=true; break;
}
if(k4==true && ke==true) {
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/audit/images/banker.png")));
k4=false;
ke=false;
}
else if(k5==true && ke==true) {
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/audit/images/tie.png")));
k5=false;
ke=false;
}
else if(k6==true && ke==true) {
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/audit/images/player.png")));
k6=false;
ke=false;
}
else if(vs==true && ke==true) {
jLabel1.requestFocus();
jLabel1.setIcon(null);
vs=false;
ke=false;
}
enter_squence();
}