5

矢印キーを含む GUI を使用して、Swing を使用して Java でプログラムを作成しています。矢印キーは、キーボードの矢印キーに対応しています。

キーボードの上矢印キーを押すと、GUI 上の上矢印キーが押されたように表示されるようにしたいと思います。矢印キーを離すまで、まだ押されていることを示し、離すと離す必要があります。

これまでの私のコードのスニペット (上へボタンのみ) は、ショーが押されているカテゴリでは完全に間違っていると思います:

...
if (e.getKeyCode() == KeyEvent.VK_UP) {
                    actionArrowUp();
                    JButton buttonUp = (JButton) mainTab.getComponent(4);
                    buttonUp.setSelected(true);
                }
...
@Override
public void keyReleased(KeyEvent e) { 
            if (e.getKeyCode() == KeyEvent.VK_UP)
                actionArrowUpRelease();
                buttonUp.setSelected(true);
4

2 に答える 2

4

keyBindings を使用する (@trashgod が既に述べように)方法です。スペース/エンターでボタンをアクティブにした場合とまったく同じ視覚的動作を取得するには (ボタンがフォーカスされている場合)

  • 押された/離されたために登録されたボタンのデフォルトアクションに委譲するアクションを実装する
  • シミュレートするには、キーを押したときと離したときの両方にバインドする必要があります
  • タイプ WHEN_ANCESTOR の inputMap でボタンの親へのバインディングをインストールします

コード内:

// the delegating  action
public static class SimulateButtonAction extends AbstractAction {

    AbstractButton button;

    public SimulateButtonAction(AbstractButton model, String fire) {
        super(fire);
        this.button = model;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Action delegate = button.getActionMap().get(getName());
        delegate.actionPerformed(new ActionEvent(button, 
                ActionEvent.ACTION_PERFORMED, getName()));
    }

    public String getName() {
        return (String) getValue(Action.NAME);
    }

}

// example usage
JComponent content = new JPanel(new GridLayout(0, 5));
Action log = new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("triggered: " + ((AbstractButton) e.getSource()).getText());
    }

};
String pressed = "pressed";
String released = "released";
ActionMap actionMap = content.getActionMap();
InputMap inputMap = content.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
String[] arrows = {"UP", "DOWN", "LEFT", "RIGHT"};
for (int i = 0; i < arrows.length; i++) {
    JButton button = new JButton(log);
    button.setAction(log);
    button.setText(arrows[i]);
    content.add(button);
    // simulate pressed
    String pressedKey = pressed + arrows[i];
    inputMap.put(KeyStroke.getKeyStroke(arrows[i]), pressedKey);
    actionMap.put(pressedKey, new SimulateButtonAction(button, pressed));
    String releasedKey = released + arrows[i];
    inputMap.put(KeyStroke.getKeyStroke(released + " " +arrows[i]), releasedKey);
    actionMap.put(releasedKey, new SimulateButtonAction(button, released));
}
于 2012-10-20T14:26:51.733 に答える
4

これLinePanelは、キー バインドを使用し、説明したものと同様の効果を達成するためにdoClick()呼び出します。actionPerformed()

補遺: キーが押されている間、ボタンが押されたように見せたいので、オプションのonKeyReleasedパラメータを使用できる場合がありますKeyStroke.getKeyStroke()。で説明されてButtonModelいるように、ボタンでマウスを押し下げた状態をシミュレートするには、モデルを準備して押した状態にする必要があります。

于 2012-10-20T12:58:47.710 に答える