자바 이벤트 리스너 예제

좀 더 구체적인 수준에서는 다른 Java와 마찬가지로 이벤트 연결이 강력하게 입력된다는 의미이기도 합니다. 따라서 잘못된 종류의 구성 요소를 실수로 연결하는 것은 불가능합니다. 예를 들어 단추에 addItemListener() 메서드가 없기 때문에 JButton에서 ItemEvents를 수신하도록 등록할 수 없습니다. Java는 컴파일 타임에 어떤 유형의 이벤트를 누구에게 전달할 수 있는지 알고 있습니다. 이벤트 소스가 하나의 이벤트 리스너(유니캐스트 배달)만 지원할 수 있는 경우 추가 리스너 메서드는 java.util.TooManyListenException을 throw할 수 있습니다. 다음은 Java에서 가장 일반적인 이벤트 유형 중 일부입니다: 마우스의 상태를 추적하는 MouseEvents 및 사용자가 키보드를 사용할 때 발생되는 KeyEvents는 java.awt.event.InputEvents의 종류입니다. 사용자가 키를 누르거나 구성 요소 영역 내에서 마우스를 이동하면 해당 구성 요소가 소스로 식별된 이벤트가 생성됩니다. ActionEvents는 사용자가 단추를 클릭하거나 Enter 를 누르는 등 구성 요소로 수행한 결정적인 “작업”에 해당합니다. ActionEvent는 프로그램에서 수행할 작업(작업 명령)의 이름을 전달합니다. MouseEvents는 사용자가 구성 요소 영역 내에서 마우스를 사용할 때 생성됩니다. 마우스의 상태를 설명하므로 마우스 Event를 만들 때의 x 및 y 좌표 및 마우스 단추 의 상태와 같은 정보를 전달합니다.

Java에서의 이벤트 처리는 두 가지 핵심 요소로 구성됩니다: 이벤트는 단일 소스 개체에서 하나 이상의 수신기로 전송됩니다. 수신기는 이벤트 유형을 수신할 수 있도록 규정된 이벤트 처리 메서드를 구현합니다. 그런 다음 이러한 종류의 이벤트의 소스에 자신을 등록합니다. 경우에 따라 어댑터 개체가 이벤트 소스와 수신기 간에 삽입될 수 있지만 어떤 경우에도 이벤트가 전달되기 전에 항상 수신기 등록이 설정됩니다. 위의 코드에서 MultiListener 및 Eavesdropper는 ActionListener 인터페이스를 구현하고 JButton addActionListener 메서드를 사용하여 작업 리스너로 등록합니다. 두 클래스의 action수행 메서드 구현은 비슷합니다: 이벤트의 작업 명령을 텍스트 영역에 추가하기만 하면 됩니다. TheReciever는 버튼의 addActionListener()를 호출하여 동작이 발생할 때 단추에서 ActionEvents를 수신합니다. 이 참조를 전달하여 ActionListener로 등록합니다. 입력이벤트는 특수 한 수정자에 대 한 플래그 집합과 함께 제공 됩니다. 이렇게 하면 마우스 단추 또는 키 누를 때 Shift, Control 또는 Alt 키가 누수되었는지 여부를 감지하고 마우스 단추를 누를 때 어떤 마우스 단추를 포함했는지 구분할 수 있습니다.

다음은 java.awt.event.InputEvent에 포함된 플래그 값입니다. 현재 규칙에는 이벤트 소스 인터페이스가 없습니다. 클래스를 분석하고 생성되는 이벤트를 확인하려는 경우 쌍을 이루는 추가 및 제거 메서드를 찾아야 합니다. 예를 들어 addActionListener() 및 removeActionListener() 메서드의 존재는 개체를 ActionEvents의 소스로 정의합니다. 사람이되는 경우 단순히 문서를 볼 수 있지만 문서를 사용할 수 없거나 클래스를 분석해야하는 프로그램을 작성하는 경우 (반사라는 프로세스) 이 디자인 패턴을 찾을 수 있습니다. (java.beans.Introspector 유틸리티 클래스는 이 작업을 수행할 수 있습니다.) 이 시점까지의 모든 명명 패턴은 무엇을 달성합니까? 한 가지, 그들은 특정 이벤트의 신성한 소스에 자동화 된 도구 및 통합 개발 환경을 가능하게한다. JavaBeans와 함께 작동하는 도구는 Java 리플렉션 및 내성 API를 사용하여 이러한 종류의 디자인 패턴을 검색하고 구성 요소에 의해 발생될 수 있는 이벤트를 식별합니다. 이벤트는 수신 개체의 이벤트 처리기 메서드에 인수로 전달 하여 전달 됩니다. 예를 들어 ActionEvents는 항상 수신기에서 actionPerformed() 라는 메서드로 전달됩니다.