1

我正在做一个需要检测是否按下了某个组合键的项目。Ctrl像, Alt, A-Z0-这样的任何键9都可以用作组合键。

我已经使用搜索了一些代码,KeyStroke.getKeyStroke但似乎它不允许没有Ctrl, Shift,Alt等的组合。

我的应用程序需要检测组合,即使没有CtrlAlt例如只是普通A++的B组合C。这也可以做到KeyStroke.getKeyStroke吗?非常感谢您的回复。

4

4 回答 4

1

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 级别上执行此操作的示例。基本成分

  • 触发器:包含要执行的最终动作的累积“武装”逻辑的实体
  • 解除/武装触发器的动作
  • 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"));
于 2012-11-18T13:32:26.940 回答
1

取决于应用程序类型是否有 GUI,对于 GUI 相关的你必须寻找

DocumentListenerKeyBindings,我建议拒绝为复杂的代码和 Focus 解决方法实现KeyListener

或添加addAWTEventListener(AWTEventListener listener, long eventMask)并且也可以监听 KeyEvents 和 MouseEvents

于 2011-12-11T14:42:23.423 回答
0

您可以播放 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);

}

于 2013-11-18T09:07:35.343 回答
0

我尝试了很多方法,终于找到了一种可以通过任意两个组合键执行的方法。

下面是我的 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();


} 
于 2019-08-19T16:37:51.590 回答