java - 如何缩短此 KeyListener 代码

标签 java swing jframe keylistener performance

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

关于java - 如何缩短此 KeyListener 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23810778/

相关文章:

java - 设置存储位置 JackRabbit

java - 如何在树表中添加复选框

java - JPanel 和 JButton,无法弄清楚如何布局 2 个简单按钮

java - 如何动态改变JLabel的内容

java - 从资源中的图像设置图标图像

java - Java中的基本输入和输出

java - 发送消息导致异常

java - CAS 服务器 Tomcat 8 Java 8 高可用性(HA/集群)

java - 如何使用 JPopupmenu 的 JMenuItem 禁用特定单元格?

java - j.u.Scanner 使用中的 NullPointerException