2014-05-22 52 views
1

我正在使用此代碼來檢測用戶何時按下我的程序中的箭頭鍵。我需要將哪個箭頭鍵發送到將處理它並做它需要做的事情的方法。它的工作,但問題是我的代碼是愚蠢的和重複的,我相信這是一種縮短這種方式。如果這樣做更容易,我可以傳遞整數0-3而不是字符串。這是我的代碼現在:如何縮短此KeyListener代碼

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"); 
    } 
}); 
+0

那不是'KeyListener',這些都是關鍵的綁定(這是正確的方式去)。看看[這裏](http://stackoverflow.com/questions/22741215/how-to-use-key-bindings-instead-of-key-listeners)一個封裝一個動作中的所有移動命令的例子。 – user1803551

回答

1

將方法的常用功能抽象化:

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

Sergiy表明,您仍然需要將「命令」作爲變量保存在Action中。 – camickr

+0

@camickr不,我不知道。 – Boann

+1

+1,我今天學到了東西。爲內部類創建變量的簡單方法是使參數變量最終。 – camickr

0

創建延伸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")); 
+0

我已經在我的主類的頂部添加了內部類,然後用getRootPane()方法(加上其他3個方向)替換了這個巨大的代碼塊,但是我沒有得到任何響應4個方向。 – user3665713