有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

密钥绑定Java密钥绑定

我需要绑定所有的箭头键来执行相同的功能,但每次都会得到哪个键被按下。目前,只有通过以下按钮按下向右箭头键时,我才有

DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");

Action MvRight = new AbstractAction()
{
     public void actionPerformed(ActionEvent e)
     {
           //Do whatever here
     }
};
DoneImg.getActionMap().put("RightArrow", MvRight);

但我需要这样的东西

DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RightArrow");
     DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LeftArrow");
     DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "DownArrow");
     DoneImg.getInputMap(JLabel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");

     Action MvAll = new AbstractAction()
         {
                 public void actionPerformed(ActionEvent e)
              {
                  if (e.keypressed == "LeftArrow")
                         {System.out.println("The left arrow was pressed!");}
                  if (e.keypressed == "RightArrow")
                         {System.out.println("The right arrow was pressed!");}
                  //and so forth
              }
                 };
     DoneImg.getActionMap().put("RightArrow", MvAll);
     DoneImg.getActionMap().put("LeftArrow", MvAll);
     DoneImg.getActionMap().put("UpArrow", MvAll);
     DoneImg.getActionMap().put("DownArrow", MvAll);

共 (1) 个答案

  1. # 1 楼答案

    您所问的实际上是违反直觉的,并且与密钥绑定API的设计背道而驰

    其目的是为每个按键提供一个单独的工作单元。在我看来,这意味着每个箭头键都应该有单独的操作

    它让你更容易遵循逻辑,做出改变,根据需要规避行动

    但我是谁能说出正确的话呢

    如果你看不到你的方法,一种简单的方法是给每个动作分配一个“命令”,当actionPerformed被触发时,你可以询问这些动作

    public TestKeyBindings02() {
        JPanel panel = new JPanel();
        InputMap im = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
        ActionMap am = panel.getActionMap();
    
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RightArrow");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LeftArrow");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "DownArrow");
    
        am.put("RightArrow", new ArrowAction("RightArrow"));
        am.put("LeftArrow", new ArrowAction("LeftArrow"));
        am.put("UpArrow", new ArrowAction("UpArrow"));
        am.put("DownArrow", new ArrowAction("DownArrow"));
    }
    
    public class ArrowAction extends AbstractAction {
    
        private String cmd;
    
        public ArrowAction(String cmd) {
            this.cmd = cmd;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            if (cmd.equalsIgnoreCase("LeftArrow")) {
                System.out.println("The left arrow was pressed!");
            } else if (cmd.equalsIgnoreCase("RightArrow")) {
                System.out.println("The right arrow was pressed!");
            } else if (cmd.equalsIgnoreCase("UpArrow")) {
                System.out.println("The up arrow was pressed!");
            } else if (cmd.equalsIgnoreCase("DownArrow")) {
                System.out.println("The down arrow was pressed!");
            }
        }
    }