키 리스너 대신 키 바인딩을 활용하는 방법
키 바인딩을 고려하는 이유
키 바인딩은 키 리스너에 비해 이점을 제공합니다. 포함:
키 바인딩 구현
키 바인딩에는 두 개의 객체, 즉 InputMap과 ActionMap이 포함됩니다. InputMap은 사용자 입력을 작업 이름과 연결하는 반면 ActionMap은 작업 이름을 작업에 매핑합니다. 키를 누르면 InputMap이 액션 이름을 검색하고 ActionMap이 해당 액션을 실행합니다.
이 프로세스는 다음 코드에 설명되어 있습니다.
myComponent.getInputMap().put("userInput", "myAction"); myComponent.getActionMap().put("myAction", action);
WHEN_IN_FOCUSED_WINDOW 사용
주어진 예에서 InputMap은 다음을 사용합니다. WHEN_IN_FOCUSED_WINDOW - 포커스가 있는 창 내의 구성 요소에 대한 입력을 허용합니다. 이는 여러 개체가 동시에 입력을 받아야 하는 시나리오에 적합합니다.
키 바인딩 예제
질문 코드에 제공된 예제를 수정하여 키 바인딩을 사용할 수 있습니다. 아래와 같이:
import javax.swing.*; public class MyGame extends JFrame { private static final String MOVE_UP = "move up"; private static final String MOVE_DOWN = "move down"; private static final String FIRE = "move fire"; static JLabel obj1 = new JLabel(); static JLabel obj2 = new JLabel(); public MyGame() { obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("UP"), MOVE_UP); obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("DOWN"), MOVE_DOWN); obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("control CONTROL"), FIRE); obj1.getActionMap().put(MOVE_UP, new MoveAction(1, 1)); obj1.getActionMap().put(MOVE_DOWN, new MoveAction(2, 1)); obj1.getActionMap().put(FIRE, new FireAction(1)); obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("W"), MOVE_UP); obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("S"), MOVE_DOWN); obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke("T"), FIRE); obj2.getActionMap().put(MOVE_UP, new MoveAction(1, 2)); obj2.getActionMap().put(MOVE_DOWN, new MoveAction(2, 2)); obj2.getActionMap().put(FIRE, new FireAction(2)); add(obj1); add(obj2); } static void rebindKey(KeyEvent ke, String oldKey) { obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .remove(KeyStroke.getKeyStroke(oldKey)); obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStrokeForEvent(ke), obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .get(KeyStroke.getKeyStroke(oldKey))); } public static void main(String[] args) { new MyGame(); } private class MoveAction extends AbstractAction { int direction; int player; MoveAction(int direction, int player) { this.direction = direction; this.player = player; } @Override public void actionPerformed(ActionEvent e) { // Implement move action for the player. } } private class FireAction extends AbstractAction { int player; FireAction(int player) { this.player = player; } @Override public void actionPerformed(ActionEvent e) { // Implement fire action for the player. } } }
추가 기능
키 바인딩은 추가 기능을 제공합니다.
위 내용은 스윙 애플리케이션에서 키 리스너 대신 키 바인딩을 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!