有 Java 编程相关的问题?

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

java如何缩短此KeyListener代码

我用这段代码来检测用户何时按下程序中的箭头键。我需要哪个箭头键被按下发送到一个方法,它将处理它,并做它需要做的事情。这是可行的,但问题是我的代码太长而且重复,我相信有办法缩短它。我可以传递整数0-3而不是字符串,如果这样做更容易的话。这是我现在的代码:

getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "left"); 
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right");
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");
getRootPane().getActionMap().put("left", new AbstractAction(){
    public void actionPerformed(ActionEvent e)
    {
        close("left");
    }
});
getRootPane().getActionMap().put("right", new AbstractAction(){
    public void actionPerformed(ActionEvent e)
    {
        close("right");
    }
});
getRootPane().getActionMap().put("up", new AbstractAction(){
    public void actionPerformed(ActionEvent e)
    {
        close("up");
    }
});
getRootPane().getActionMap().put("down", new AbstractAction(){
    public void actionPerformed(ActionEvent e)
    {
        close("down");
    }
});

共 (2) 个答案

  1. # 1 楼答案

    创建一个内部类,该类扩展AbstractAction并可以获取字符串参数

    像这样的

    private class CloseAction extends AbstractAction {
        private final String action;
        public CloseAction(String anAction) {
            action = anAction;
        }
    
        public void actionPerformed(ActionEvent e) {
            close(action);
        }
    }
    

    然后:

    getRootPane().getActionMap().put("up", new CloseAction("up"));
    
  2. # 2 楼答案

    将通用功能抽象为一种方法:

    private void mapKey(String keyStroke, final String command) {
        Action action = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                close(command);
            }
        };
        getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
            .put(KeyStroke.getKeyStroke(keyStroke), action);
        getRootPane().getActionMap()
            .put(action, action);
    }
    

    然后你可以做:

    mapKey("LEFT",  "left");
    mapKey("RIGHT", "right");
    mapKey("UP",    "up");
    mapKey("DOWN",  "down");