1

特定のキーの組み合わせが押されたかどうかを検出する必要があるプロジェクトを行っています。CtrlAltA- Z0-などの任意のキー9をキーの組み合わせとして使用できます。

を使用していくつかのコードを検索しましたが、、、、などのKeyStroke.getKeyStrokeない組み合わせは許可されていないようです。CtrlShiftAlt

私のアプリケーションは、なしでも組み合わせを検出する必要がありCtrlます。Altたとえば、単純なA+ B+の組み合わせだけCです。これもでできKeyStroke.getKeyStrokeますか?返信は大歓迎です。

4

4 に答える 4

1

アプリケーションの種類によって、GUI があるかどうかに依存します。GUI 関連の場合は、探す必要があります。

DocumentListenerKeyBindings 、複雑なコード以上のKeyListenerの実装とフォーカスの回避策を拒否することをお勧めします

またはaddAWTEventListener(AWTEventListener listener, long eventMask)を追加すると、KeyEvents と MouseEvents もリッスンできる可能性があります

于 2011-12-11T14:42:23.423 に答える
1

私の知る限り、キーのステータスを取得する方法はありません。それは次のようなものではありません。

KeyStroke keyStroke = KeyStroke.getKeyStroke("A");
// NOT supported
if (keyStroke.isPressed()) {
  // do something
}

サポートされている唯一のものは、単一のキーのステータスの変更に関する通知です。Fi は、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 に答える
0

KeyListener の keyPressed メソッドと keyReleased メソッドを再生できます。キーボードで入力すると、keyReleased の前に keyPressed イベントが最初に発生します。押されたキーでキーイベントを取得し、ビジネスロジックでリリースされたキーでキーの組み合わせをキャッチできます。

public void keyPressed(KeyEvent evt) {

      keyHit = KeyEvent.getKeyText(evt.getKeyCode());            
      System.out.println("Key Pressed is "+keyHit);

}

public void keyReleased(KeyEvent evt) {

      stringBuffer.append(keyHit)      
      System.out.println("Key Released is "+keyHit);

}

于 2013-11-18T09:07:35.343 に答える