> Java > java지도 시간 > 스윙 애플리케이션에서 키 리스너 대신 키 바인딩을 사용하는 이유는 무엇입니까?

스윙 애플리케이션에서 키 리스너 대신 키 바인딩을 사용하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-17 00:50:25
원래의
320명이 탐색했습니다.

Why Use Key Bindings Instead of Key Listeners in Swing Applications?

키 리스너 대신 키 바인딩을 활용하는 방법

키 바인딩을 고려하는 이유

키 바인딩은 키 리스너에 비해 이점을 제공합니다. 포함:

  • 입력을 위해 구성 요소를 클릭할 필요 없음: 이를 통해 사용자의 혼란스러운 동작을 제거하고 여러 객체가 동시에 입력을 받을 수 있습니다.
  • 더 쉬워졌습니다. 유지 관리 및 조작: 바인딩은 사용자 비활성화, 재바인딩 및 재할당을 단순화합니다. actions.

키 바인딩 구현

키 바인딩에는 두 개의 객체, 즉 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿