【问题标题】:java - Can Keybinders Implement the keyPressed and keyReleased methods?java - Keybinders 可以实现 keyPressed 和 keyReleased 方法吗?
【发布时间】:2021-09-05 13:52:17
【问题描述】:

我浏览了有关如何使用键绑定的教程,并且我以前也使用过它们,但现在情况不同了。我有一个钢琴卷,其键对应于键盘键。我需要使用 keyPressed 和 keyReleased 方法让程序知道何时停止和启动钢琴音符。

编辑:

得到答案后的工作代码如下:

在 JLayeredPane 构造函数中:

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

以及相应的 keyPressed/keyReleased 操作的方法和类:

    public void mapKeyboard(InputMap im, ActionMap am)
    {
        int count = 0;
        for(int j = 0; j<10; j++)
        {
            im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, false), "KeyDown" + count + "");
            im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, true), "KeyUp" + count + "");

            am.put("KeyDown" + count + "", new WhiteKeyDown(count, j));
            am.put("KeyUp" + count + "", new WhiteKeyUp(count, j));
            count++;
        }

        for(int j = 0; j<7; j++)
        {
            im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, false), "KeyDown" + count + "");
            im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, true), "KeyUp" + count + "");

            am.put("KeyDown" + count + "", new BlackKeyDown(count, j));
            am.put("KeyUp" + count + "", new BlackKeyUp(count, j));
            count++;
        }

        for(int j = 10; j<17; j++)
        {
            im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, false), "KeyDown" + count + "");
            im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, true), "KeyUp" + count + "");

            am.put("KeyDown" + count + "", new WhiteKeyDown(count, j));
            am.put("KeyUp" + count + "", new WhiteKeyUp(count, j));
            count++;
        }

        for(int j = 7; j<12; j++)
        {
            im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, false), "KeyDown" + count + "");
            im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, true), "KeyUp" + count + "");

            am.put("KeyDown" + count + "", new BlackKeyDown(count, j));
            am.put("KeyUp" + count + "", new BlackKeyUp(count, j));
            count++;
        }

    }


    class WhiteKeyDown extends AbstractAction
    {
        int index;

        public WhiteKeyDown(int i, int j)
        {
            super("KeyDown" + i + "");
            index = j;
            putValue(Action.NAME, "KeyDown" + i + "");
            putValue(ACTION_COMMAND_KEY, "KeyDown" + i + "");
        }

        @Override
        public void actionPerformed(ActionEvent ke) {
            if(isWhiteDown[index] == false)
            {
                channel.noteOn (((WhiteKey) WhiteKeys[index]).getNote (), 127);
                isWhiteDown[index] = true;
                WhiteKeys[index].setBackground(Color.LIGHT_GRAY);
                Key key = (Key) WhiteKeys[index];
                CreateOnEvent(key);
            }
        }
    }

    class WhiteKeyUp extends AbstractAction
    {
        int index;

        public WhiteKeyUp(int i, int j)
        {
            super("KeyUp" + i + "");
            index  = j;
            putValue(Action.NAME, "KeyUp" + i + "");
            putValue(ACTION_COMMAND_KEY, "KeyUp" + i + "");
        }

        @Override
        public void actionPerformed(ActionEvent ke) {
            if(isWhiteDown[index] == true)
            {
                channel.noteOff (((WhiteKey) WhiteKeys[index]).getNote (), 127);
                isWhiteDown[index] = false;
                WhiteKeys[index].setBackground(Color.WHITE);
                Key key = (Key) WhiteKeys[index];
                CreateOffEvent(key);
            }
        }
    }

    class BlackKeyDown extends AbstractAction
    {
        int index;

        public BlackKeyDown(int i, int j)
        {
            super("KeyDown" + i + "");
            index = j;
            putValue(Action.NAME, "KeyDown" + i + "");
            putValue(ACTION_COMMAND_KEY, "KeyDown" + i + "");
        }

        @Override
        public void actionPerformed(ActionEvent ke) {
            if(isBlackDown[index] == false)
            {
                channel.noteOn (((BlackKey) BlackKeys[index]).getNote (), 127);
                isBlackDown[index] = true;
                BlackKeys[index].setBackground(Color.DARK_GRAY);
                Key key = (Key) BlackKeys[index];
                CreateOnEvent(key);
            }
        }
    }

    class BlackKeyUp extends AbstractAction
    {
        int index;

        public BlackKeyUp(int i, int j)
        {
            super("KeyUp" + i + "");
            index = j;
            putValue(Action.NAME, "KeyUp" + i + "");
            putValue(ACTION_COMMAND_KEY, "KeyUp" + i + "");
        }

        @Override
        public void actionPerformed(ActionEvent ke) {
            if(isBlackDown[index] == true)
            {
                channel.noteOff (((BlackKey) BlackKeys[index]).getNote (), 127);
                isBlackDown[index] = false;
                BlackKeys[index].setBackground(Color.BLACK);
                Key key = (Key) BlackKeys[index];
                CreateOffEvent(key);
            }
        }
    }

【问题讨论】:

  • 是的,您可以对 keyPressed 和 keyReleased 使用不同的操作。

标签: java key-bindings


【解决方案1】:

是的……

KeyStroke.getKeyStroke(int, int, boolean)

还有一个简单的exmple

【讨论】:

  • 谢谢,在看到你发帖之前我就想通了。尽管如此,非常感谢!这是结果代码: im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 0, false), "ZKeyDown"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 0, true), "ZKeyUp");钢琴.getActionMap().put("ZKeyDown", new ZKeyDown("ZKeyDown"));钢琴.getActionMap().put("ZKeyUp", new ZKeyUp("ZKeyUp")); (当然还有抽象类)
  • @AFinch,用代码更新你的问题。我们无法阅读评论中发布的代码。
  • 哎呀,对不起。我很快就会实现它,我会发布它,因为它比这更好。
猜你喜欢
  • 2018-09-02
  • 2014-03-05
  • 2018-06-24
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多