> Java > java지도 시간 > Java 스윙 키 처리: 키 바인딩 또는 키 리스너 – 무엇을 선택해야 합니까?

Java 스윙 키 처리: 키 바인딩 또는 키 리스너 – 무엇을 선택해야 합니까?

Susan Sarandon
풀어 주다: 2024-12-17 04:13:25
원래의
893명이 탐색했습니다.

Java Swing Key Handling: Key Bindings or Key Listeners – Which Should You Choose?

Java Swing의 키 바인딩과 키 리스너 비교: 종합 가이드

키 바인딩과 키 리스너는 사용자 입력 이벤트를 처리하는 두 가지 접근 방식입니다. Java Swing 애플리케이션의 키에서. 키 리스너는 키 누름을 감지하는 간단한 방법을 제공하지만 키 바인딩은 다음과 같은 여러 가지 이점을 제공합니다.

  • 향상된 응답성: 키 바인딩은 사용자가 개체를 클릭할 필요가 없습니다. 집중하여 더욱 빠르고 직관적인 입력 처리가 가능합니다.
  • 향상됨 유지 관리 용이성: 키 바인딩을 사용하면 사용자 작업을 더 쉽게 비활성화하고 다시 바인딩하고 재할당할 수 있어 유지 관리가 단순화되고 코드 가독성이 높아집니다.

키 바인딩 이해

키 바인딩에는 두 가지가 포함됩니다. object:

  • InputMap: 사용자 입력을 작업 이름에 매핑합니다.
  • ActionMap: 작업 이름을 작업에 매핑합니다.

키를 누르면 입력 맵이 해당 키를 검색하여 동작을 찾습니다. 이름. 그런 다음 액션 맵에서 액션 이름을 검색하고 액션을 실행합니다.

키 바인딩 구현

단일 키 바인딩을 생성하려면 다음 구조를 사용하세요.

myComponent.getInputMap().put("userInput", "myAction");
myComponent.getActionMap().put("myAction", action);
로그인 후 복사

WHEN_IN_FOCUSED_WINDOW 사용 InputMap

WHEN_IN_FOCUSED_WINDOW용 InputMap을 사용하면 포커스가 있는 창 내의 여러 구성 요소가 동시에 입력을 받을 수 있습니다. 예를 들어 포커스가 있는 창에 여러 탱크가 있고 입력을 받으려면 다음 구조를 사용하십시오.

tank1.getInputMap(IFW).put(KeyStroke.getKeyStroke("W"), "move up");
tank2.getInputMap(IFW).put(KeyStroke.getKeyStroke("S"), "move down");
// ...
tankN.getInputMap(IFW).put(KeyStroke.getKeyStroke("T"), "fire");
로그인 후 복사

키 리바인딩

KeyListener를 사용하는 키:

obj1.getInputMap(IFW).remove(KeyStroke.getKeyStroke(oldKey));
// ...
obj1.getInputMap(IFW).put(KeyStroke.getKeyStrokeForEvent(ke),
                 obj1.getInputMap(IFW).get(KeyStroke.getKeyStroke(oldKey)));
로그인 후 복사

코드 예

다음은 키 바인딩을 보여주는 코드 예제입니다.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MyGame extends JFrame {

    public MyGame() {
        // Do layout management, create objects, etc.
        JLabel obj1 = new JLabel();
        JLabel obj2 = new JLabel();

        // Set key bindings for object 1
        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));

        // Set key bindings for object 2
        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 objects to the JFrame
        add(obj1);
        add(obj2);
    }

    // Handle key rebinding
    public static void rebindKey(KeyEvent ke, String oldKey) {
        // Find and replace key binding
    }

    // Main method
    public static void main(String[] args) {
        new MyGame();
    }

    // Inner class for move action
    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 logic
        }
    }

    // Inner class for fire action
    private class FireAction extends AbstractAction {

        int player;

        FireAction(int player) {
            this.player = player;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // Implement fire logic
        }
    }
}
로그인 후 복사

결론

키 바인딩은 강력하고 유연한 방법을 제공합니다. Java Swing 애플리케이션에서 사용자 입력 이벤트를 처리합니다. 개발자는 키 바인딩을 활용하여 애플리케이션의 응답성, 유지 관리성 및 재사용성을 향상할 수 있습니다.

위 내용은 Java 스윙 키 처리: 키 바인딩 또는 키 리스너 – 무엇을 선택해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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