繁体   English   中英

如何缩短此KeyListener代码

[英]How to shorten this KeyListener code

我正在使用此代码来检测用户何时在程序中按下箭头键。 我需要按下哪个箭头键才能发送到将对其进行处理并执行所需操作的方法。 它正在工作,但是问题是我的代码太长且重复,我敢肯定有一种方法可以缩短它。 如果这样做更容易,我可以传递整数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");
    }
});

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

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");

创建一个扩展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"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM