【问题标题】:Release KeyBinding with Meta Mask使用 Metamask 释放键绑定
【发布时间】:2013-01-10 19:08:46
【问题描述】:

我的 Java 游戏有一个 KeyBinding,我使用元键和 Z 键向左移动。

i.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 4), "Z");
m.put("Z", sprite_moveLeft);

我如何写这个的发布形式?

i.put(KeyStroke.getKeyStroke(???????), "rZ");
m.put("rZ", sprite_rmoveLeft);

我已经试过了

i.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 4), "Z");
m.put("Z", sprite_moveLeft);
i.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 4, true), "rZ");
m.put("rZ", sprite_rmoveLeft);

但无济于事,并尝试将 KeyEvents 更改为 keycodes (int)。

【问题讨论】:

  • 查看KeyStroke上的文档
  • 请尽快发布SSCCE 以获得更好的帮助。

标签: java swing key-bindings keystrokes


【解决方案1】:

尝试使用...

KeyStroke.getKeyStroke(int keyCode, int modifiers, boolean onKeyRelease)

更新了工作示例

public class KeyBindingsTest {

    public static void main(String[] args) {
        new KeyBindingsTest();
    }

    public KeyBindingsTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new KeyBindingPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class KeyBindingPane extends JPanel {

        private JTextArea textArea;

        public KeyBindingPane() {
            setLayout(new BorderLayout());
            add(new JScrollPane((textArea = new JTextArea())));

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.ALT_DOWN_MASK, false), "Released");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.ALT_DOWN_MASK, true), "Pressed");

            am.put("Released", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("released");
                    textArea.append("Released\n");
                }
            });
            am.put("Pressed", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("pressed");
                    textArea.append("Pressed\n");
                }
            });

            setFocusable(true);
            requestFocusInWindow();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100, 100);
        }
    }
}

注意,我从未见过 KeyEvent.META_DOWN_MASK 在 Windows 上工作...

【讨论】:

  • //Z = 90 i.put(KeyStroke.getKeyStroke(90, 4, true), "rZ");这对我不起作用....
  • @minoue10 我假设你已经删除了之前的映射
  • 我一直在为按下和 KeyStroke.getKeyStroke(KeyEvent.VK_Z, 4, true) 做 KeyStroke.getKeyStroke(KeyEvent.VK_Z, 4) 但它不起作用。
  • @minoue10 如评论中提到的 SSCCE,否则一切都是黑暗的
猜你喜欢
  • 1970-01-01
  • 2012-01-21
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
相关资源
最近更新 更多