1

小さな単一ウィンドウのアプリケーション (ゲーム) には、GUI ボタン​​で制御されるグラフィカル オブジェクトがあります。それらにマッピングされた一連のキーボード ショートカットがあります (つまり、矢印キー)。ショートカットのセットをその場で変更するオプションを用意するのはかなり簡単ですか? たとえば、矢印キーと WASD の間で選択する JOption は?

私はまだバインディングに苦労していますが、スイッチ自体について私が持っているアイデアは次のとおりです。

// KeyStroke objects to be used when mapping them to the action
KeyStroke keyUp, keyLeft, keyRight, keyDown;

JRadioButton[] kbdOption = new JRadioButton[2];

kbdOption[0] = new JRadioButton("Arrow Keys");
kbdOption[1] = new JRadioButton("WASD");

if (kbdOption[0].isSelected()) {
    keyUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
    keyLeft = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
    keyRight = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0);
    keyDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
} else if (kbdOption[0].isSelected()) {
    keyUp = KeyStroke.getKeyStroke(KeyEvent.VK_W, 0);
    keyLeft = KeyStroke.getKeyStroke(KeyEvent.VK_A, 0);
    keyRight = KeyStroke.getKeyStroke(KeyEvent.VK_D, 0);
    keyDown = KeyStroke.getKeyStroke(KeyEvent.VK_S, 0);
}

自分でテストできないので、まともに見えますか?スコープは適切ですか (つまり、残りの GUI を構築する同じメソッドで実際に使用できますか、それとも if-else を別の場所から呼び出す必要がありますか)。プログラムの実行中にバインドを即座に変更して、オンザフライで動作しますか?

4

1 に答える 1

2

AlexStybaevの最初の応答を使用する傾向があります。すべてのバインディングを追加するだけです。このようなもの:

gamePanel.getActionMap().put("left", leftAction);
gamePanel.getActionMap().put("right", rightAction);
gamePanel.getActionMap().put("up", upAction);
gamePanel.getActionMap().put("down", downAction);

InputMap inputMap =
    gamePanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

inputMap.put(KeyStroke.getKeyStroke("LEFT"),  "left");
inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "right");
inputMap.put(KeyStroke.getKeyStroke("UP"),    "up");
inputMap.put(KeyStroke.getKeyStroke("DOWN"),  "down");

inputMap.put(KeyStroke.getKeyStroke("A"), "left");
inputMap.put(KeyStroke.getKeyStroke("D"), "right");
inputMap.put(KeyStroke.getKeyStroke("W"), "up");
inputMap.put(KeyStroke.getKeyStroke("S"), "down");

inputMap.put(KeyStroke.getKeyStroke("KP_LEFT"),  "left");
inputMap.put(KeyStroke.getKeyStroke("KP_RIGHT"), "right");
inputMap.put(KeyStroke.getKeyStroke("KP_UP"),    "up");
inputMap.put(KeyStroke.getKeyStroke("KP_DOWN"),  "down");

inputMap.put(KeyStroke.getKeyStroke("NUMPAD4"), "left");
inputMap.put(KeyStroke.getKeyStroke("NUMPAD6"), "right");
inputMap.put(KeyStroke.getKeyStroke("NUMPAD8"), "up");
inputMap.put(KeyStroke.getKeyStroke("NUMPAD2"), "down");
于 2012-12-15T14:39:18.437 に答える