>일반적인 문제 >객체는 어떤 행동을 인식하고 반응할 수 있나요?

객체는 어떤 행동을 인식하고 반응할 수 있나요?

青灯夜游
青灯夜游원래의
2020-08-29 11:32:594711검색

객체가 인식하고 반응할 수 있는 행동을 "이벤트"라고 합니다. 객체가 인식하고 반응할 수 있는 동작을 이벤트라고 합니다. 이벤트는 객체에서 이 동작이 발생하면 해당 이벤트가 트리거됩니다.

객체는 어떤 행동을 인식하고 반응할 수 있나요?

Java 이벤트 요약

이벤트 처리 모델

GUI 응용에서는 이벤트 처리가 필수적이므로 이벤트 처리 모델을 능숙하게 마스터해야 합니다. 이벤트의 경우 이벤트 소스 객체와 리스너 객체라는 두 가지 용어를 이해해야 합니다. 문자 그대로의 의미에서 대략적인 아이디어를 얻을 수 있습니다. 아래 시스템을 설명하겠습니다.

  • 리스너 개체는 특정 리스너 인터페이스를 구현하는 클래스의 인스턴스입니다.

  • 이벤트 소스는 다음을 수행할 수 있는 이벤트 소스입니다. 이벤트 소스는 이벤트가 발생하면 등록된 모든 리스너에게 이벤트 객체를 전달합니다. 리스너 객체는 이벤트 객체의 정보를 사용하여 이벤트에 응답하는 방법을 결정합니다. 객체를 이벤트 소스 객체에 추가하면 이벤트가 트리거될 때 시스템이 이벤트 소스를 통해 해당 리스너에 액세스할 수 있습니다. 아래와 같이

  • 이벤트 소스가 이벤트를 트리거하면 시스템은 해당 이벤트의 관련 정보를 해당 유형의 이벤트 객체에 캡슐화하여 이벤트 소스에 등록된 해당 리스너에게 보냅니다. 아래와 같이
  • 이벤트 객체가 리스너에게 전달되면 시스템은 리스너의 해당 이벤트 처리 메소드를 호출하여 이벤트를 처리, 즉 응답합니다. 아래와 같이:

객체는 어떤 행동을 인식하고 반응할 수 있나요?참고: 리스너와 이벤트 소스 사이에는 "다대다" 관계가 있습니다.

이벤트 개체의 계층 구조

객체는 어떤 행동을 인식하고 반응할 수 있나요?

이벤트 개체 중 가장 높은 수준은 모든 이벤트 상태 개체가 파생되는 루트 클래스인 java.util.EventObject입니다. Object 클래스에서 상속된 클래스 외에도 이 클래스에는 getSource() 메서드도 있습니다. 이 메서드의 기능은 Event가 원래 발생한 개체를 반환하는 것입니다.

이 클래스가 util 패키지에 있는 것을 제외하고 나머지는 java.awt, java.awt.event 패키지 또는 java.swing, java.swing.event 패키지에 있습니다. Swing 컨트롤은 Swing 이벤트만 사용한다는 점은 주목할 가치가 있습니다. .

객체는 어떤 행동을 인식하고 반응할 수 있나요?AWTEvent 클래스는 이벤트 성격의 식별자를 반환하는 getID() 메서드를 제공합니다. 예를 들어 마우스 이벤트가 발생하면 클릭인지, 드래그인지, 누르는 것인지, 기타 조작인지 확인할 수 있습니다.

일반적으로 사용되는 여러 이벤트 클래스에 대한 설명:

EventObject: 모든 이벤트 클래스의 슈퍼 클래스입니다. 가장 중요한 메소드인 getSource()는 이벤트를 생성한 객체를 반환합니다

AWTEvent: 모든 AWT 이벤트 클래스의 슈퍼 클래스입니다. 가장 중요한 메소드인 getID()는 이벤트의 ID 번호를 반환하며, 이벤트 ID는 버튼 이벤트 또는 마우스 클릭 이벤트와 같은 이벤트 유형을 지정합니다. 컴포넌트가 활성화될 때 발생하는 이벤트

AdjustmentEvent: 조정 가능한 컴포넌트를 조정할 때 발생하는 이벤트(예: 스크롤 막대 이동)

  • ComponentEvent: 컴포넌트를 조작할 때 발생하는 상위 이벤트

  • ContainerEvent: 컨테이너에 구성 요소가 추가되거나 제거될 때 발생합니다.

  • InputEvent: 입력 장치에 의해 생성된 상위 수준 이벤트

  • ItemEvent: 선택 항목, 확인란 또는 목록에서 선택할 때 발생합니다.

  • KeyEvent: 키보드를 조작할 때 발생

  • MouseEvent: Operation 마우스를 사용할 때 발생

  • PaintEvent: 컴포넌트를 그릴 때 발생하는 이벤트

  • TextEvent: 텍스트가 변경될 때 발생

  • WindowEvent: 창을 최대화하거나 최소화하는 등 창을 조작할 때 발생하는 이벤트입니다.

  • 리스너 객체의 계층 구조
  • 리스너 객체는 특정 리스너 인터페이스를 구현하는 클래스의 인스턴스이므로 우리가 관심을 갖는 부분은 리스너 인터페이스입니다. 리스너 인터페이스의 최상위 인터페이스는 java.util.EventListener입니다. 이 인터페이스는 모든 이벤트 리스너 인터페이스가 확장해야 하는 표시 인터페이스입니다. 놀라운 점은 이 인터페이스가 완전히 비어 있다는 것입니다. 소스 코드를 확인하면 비어 있습니다.

  • 이벤트 리스너 클래스(리스너 객체가 속한 클래스)는 이벤트 리스너 인터페이스를 구현하거나 이벤트 리스너 어댑터 클래스를 상속해야 합니다.

  • 이벤트 리스너 인터페이스는 이벤트를 처리하기 위해 구현해야 하는 메서드를 정의합니다.

이벤트 리스너 어댑터 클래스는 이벤트 리스너 인터페이스의 간단한 구현입니다. 목적은 프로그래밍 작업량을 줄이는 것입니다.

이벤트 리스너의 인터페이스 이름 지정 방법은 XXListener이며 Java에서는 이러한 인터페이스가 이미 정의되어 있습니다. 구현되는 데 사용되는 이벤트 핸들러(즉, 이벤트 처리 메서드 프로토타입, 이 메서드를 다시 구현해야 함)를 정의합니다.

예: ActionListener 인터페이스, MouseListener 인터페이스, WindowListener 인터페이스, KeyListener 인터페이스, ItemListener 인터페이스, MouseMotionListener 인터페이스, FocusListener 인터페이스, ComponentListener 인터페이스 등

이벤트 소스

이벤트는 이벤트 소스에 의해 초기에 생성되며 이벤트는 소스는 GUI 구성요소일 수 있습니다. 이벤트를 생성할 수 있는 Java Bean 또는 객체일 수 있습니다. GUI 구성요소의 경우 이벤트 소스는 구성요소의 피어(Abstract Window Toolkit [awt] GUI 구성요소의 경우) 또는 구성요소 자체(Swing의 경우)입니다. 구성 요소).

Java에서는 각 구성 요소가 생성할 이벤트 종류가 정의되어 있습니다. 즉, 모든 이벤트에 대해 어떤 구성 요소가 해당 이벤트를 생성할 수 있는지는 이미 결정되어 있습니다.

Events

AWT는 이벤트를 하위 수준 이벤트와 의미 이벤트로 나눕니다.

  • 시맨틱 이벤트는 사용자 작업을 나타내는 이벤트입니다.

  • 하위 수준 이벤트는 해당 이벤트를 구성하는 이벤트입니다.

java.awt.event 패키지의 일반적인 의미 이벤트 클래스:

  • ActionEvent(버튼 클릭, 메뉴 선택, 선택한 목록 항목 또는 텍스트 상자에 입력에 해당)

  • AdjustmentEvent(사용자가 스크롤 막대 )

  • ItemEvent(사용자가 체크박스 또는 목록 상자에서 항목 선택)

일반적으로 사용되는 5가지 하위 수준 이벤트 클래스:

  • KeyEvent(키를 누르거나 놓음)

  • MouseEvent(마우스 버튼을 누르거나 놓거나 이동하거나 끌기)

  • MouseWheelEvent(마우스 휠을 돌림)

  • FocusEvent(구성 요소가 포커스를 얻거나 잃음)

  • WindowEvent(창 상태) 변경됨)

java.awt.event 패키지에 정의된 일반적인 이벤트 어댑터 클래스는 다음과 같습니다.

 1. ComponentAdapter(컴포넌트 어댑터)

 2. ContainerAdapter(컨테이너 어댑터)

 3. FocusAdapter(포커스 어댑터)

 4. KeyAdapter(키보드 어댑터)

 5. MouseAdapter(마우스 어댑터)

 6. MouseMotionAdapter(마우스 모션 어댑터)

 7. WindowAdapter(윈도우 어댑터)

이벤트 소스와 리스너의 대응 관계

다음 그림은 실제 Java 개발에서의 대응 관계 다이어그램입니다.

객체는 어떤 행동을 인식하고 반응할 수 있나요?

공통 이벤트 객체와 리스너 비교표:

객체는 어떤 행동을 인식하고 반응할 수 있나요?

공통 이벤트 소스와 리스너 인터페이스 비교표
리스너 인터페이스 이벤트 소스
ActionListener AbstractButton
제이콤보박스
JTextField
Timer
AdjustmentListener JscrollBar
ItemListener AbstractButton
JComboBox
FocusListener Component
KeyListener Component
MouseListener Component
MouseMotionListener Component
MouseWheelListener Component
WindowListener Window
WindowFocusListener Window
WindowStateListener Window

제안: 이 부분을 이해하려면 먼저 Java 시각적 구성 요소와 컨테이너 간의 일반적인 관계를 이해해야 이해가 쉬워집니다.

일반적인 프로그램 개발 단계

프로그램 개발자로서 우리가 해야 할 일은 이벤트 리스너 객체를 생성하고 이를 활성화된(신규) 이벤트가 되는 컴포넌트에 등록하는 것입니다. 소위 이벤트 리스너 객체를 생성한다는 것은 클래스를 생성한다는 의미이며, 이 클래스는 XXListener 형식의 인터페이스를 구현해야 합니다(또는 "XXListener를 구현한 클래스"를 상속함). 물론 이 인터페이스를 구현한다는 것은 메서드를 재정의한다는 의미입니다. XXListener의

예를 들어 ActionListener의 경우 하나의 actionPerformed 메서드만 있습니다.

class B1 implements ActionListener{// 实现ActionListener
    @override
    public void actionPerformed(ActionEvent e){
	//重写actionPerformed     
        //do somthing....
    }
}

활성화된 이벤트의 구성 요소에 이벤트 리스너를 등록합니다. 즉, addXXListener() 형식으로 메서드를 호출합니다.

예:

Button b1 = new Button("Button 1");
b1.addActionListener(new B1()); //注册事件监听器

b1은 활성화된 이벤트의 구성 요소입니다. 이렇게 이벤트가 활성화되면 처리 흐름은 다음과 같습니다. addActionListener를 통해 이벤트 리스너가 등록되었으므로 특정 이벤트 처리는 다음과 같습니다. 호출되는 메소드, 즉 actionPerformed() 함수입니다. 이런 식으로 실행 결과는 actionPerformed가 구체적으로 수행하는 작업에 따라 달라집니다.

리스너는 특정 이벤트 소스만 수신하므로 익명 개체를 사용하여 리스너를 등록할 수 있습니다.

예:

JButton b=new JButton("jjjj");
b.addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent e) {
		//重写actionPerformed     
        //do somthing....
	}
});

Java Swing에서 각 구성 요소 이벤트를 처리하는 일반적인 단계는 다음과 같습니다.
 1. 새 구성 요소(예: JButton)를 만듭니다.
 2. 해당 패널(예: JPanel)에 구성요소를 추가합니다.
 3. 이벤트 소스에서 생성된 이벤트를 수신할 리스너를 등록합니다(예: ActionListener를 사용하여 사용자의 버튼 클릭에 응답).
 4. 이벤트를 처리할 메서드를 정의합니다(예: ActionListener의 actionPerformed에서 해당 메서드 정의).

위에서 리스너 클래스를 생성하는 첫 번째 방법은 내부 클래스일 수 있고, 두 번째 방법은 리스너를 생성하는 익명 내부 클래스이므로 이해하기 쉽습니다.

응답과 인터페이스의 분리 설계

이벤트 처리와 인터페이스를 함께 작성합니다. 하나는 유지 관리가 불편하고, 다른 하나는 현재 코드 파일을 부풀리게 하므로 이벤트의 응답을 분리하는 것이 좋습니다. 이는 처음 두 가지 결함을 보완할 뿐만 아니라 코드의 재사용성을 향상시킵니다. 하지만 내부 클래스와 익명 내부 클래스의 사용을 무시하지 마세요. 각각 고유한 장점과 단점이 있고 포괄적으로 고려해야 하기 때문입니다.

Swing 패키지는 명령을 캡슐화하고 이를 Action 인터페이스인 여러 이벤트 소스에 연결하는 매우 실용적인 메커니즘을 제공합니다. 작업은 다음을 캡슐화하는 개체입니다.

  • 명령 설명(텍스트 문자열 및 선택적 아이콘)

  • 명령을 실행하는 데 필요한 매개변수(예: 나열된 예에서 요청된 색상 변경)

자세한 내용은 API를 참고해주세요.

액션은 클래스가 아니라 인터페이스라는 점에 유의해야 합니다. 이 인터페이스를 구현하는 모든 클래스는 7개의 메서드를 구현해야 합니다. 다행히도 ActionPerformed 메서드를 제외하고 이 인터페이스의 모든 메서드를 구현하는 클래스가 있는데, 바로 AbstractAction입니다. 이 클래스는 모든 이름/값 쌍을 저장하고 속성 변경 리스너를 관리합니다. AbstractAction 클래스를 직접 확장하고 확장된 클래스에 actionPerformed 메서드를 구현할 수 있습니다.

내가 본 더 나은 디자인 방법은 리스너 클래스가 javax.swing.AbstractAction을 상속하고 구성 요소에 등록할 때 구성 요소가 리스너에 전달된다는 것입니다.

리스너:

public class AC_temp extends AbstractAction{
	private static final long serialVersionUID = 1L;
	MainFrame main;
	public AC_EditVideoInfo(MainFrame temp,Color color) {
		main=temp;
		putValue(Action.NAME, "name");
		putValue(Action.SMALL_ICON, new ImageIcon("images/edit.png"));
		putValue(Action.SHORT_DESCRIPTION, "description");
                putValue("color",color);
                //....
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// do something
	}
}

이벤트 소스:

组件.addActionListener(new AC_EditVideoInfo(this));//注册监听器

메서드 호출을 포함하는 리스너를 생성하세요

java.beans.EventHandler는 이름 지정 관점에서 볼 때 이벤트 관리자입니다. 공식 API에서 제공하는 설명은 다음과 같습니다. EventHandler 클래스는 이벤트 리스너를 동적으로 생성하기 위한 지원을 제공합니다. 이러한 리스너의 메서드는 들어오는 이벤트 개체 및 대상 개체와 관련된 간단한 명령문을 실행합니다.

자세한 설명은 참고:————————>>>>>>>>>

EventHandler 사용 예:

EventHandler 가장 간단한 사용 방법 매개변수 없이 대상 객체에 메소드를 호출하는 리스너를 설치합니다. 다음 예제에서는 javax.swing.JFrame 인스턴스에서 toFront 메서드를 호출하는 ActionListener가 생성됩니다.

myButton.addActionListener(
    (ActionListener)EventHandler.create(ActionListener.class, frame, "toFront"));

myButton을 누르면 Frame.toFront() 문이 실행됩니다. ActionListener 인터페이스의 새로운 구현을 정의하고 해당 인스턴스를 버튼에 추가함으로써 사용자는 추가적인 컴파일 시간 유형 안전성으로 동일한 효과를 얻을 수 있습니다.

//Equivalent code using an inner class instead of EventHandler.
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        frame.toFront();
    }
});

EventHandler의 또 다른 간단한 사용법은 리스너 인터페이스에서입니다( 속성을 추출합니다). 이벤트 객체에 있는 메서드의 첫 번째 매개 변수 값)을 사용하여 대상 객체의 속성 값을 설정합니다. 다음 예제에서는 대상(myButton) 객체의 nextFocusableComponent 속성을 이벤트의 "source" 속성 값으로 설정하는 ActionListener가 생성됩니다.

EventHandler.create(ActionListener.class, myButton, "nextFocusableComponent", "source")

이는 다음 내부 클래스 구현에 해당합니다.

//Equivalent code using an inner class instead of EventHandler.
new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        myButton.setNextFocusableComponent((Component)e.getSource()); 
    }
}

들어오는 이벤트 개체를 대상 작업에 전달하는 EventHandler를 만드는 것도 가능합니다. EventHandler.create의 네 번째 매개변수가 빈 문자열인 경우 이벤트는 다음과 같이 전달됩니다.

EventHandler.create(ActionListener.class, target, "doActionEvent", "")

이는 다음 내부 클래스 구현에 해당합니다.

//Equivalent code using an inner class instead of EventHandler.
new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        target.doActionEvent(e);
    }
}

EventHandler 最常见的用法可能是从事件对象的 source 中提取属性值,并将此值设置为目标对象的属性值。在以下示例中,将创建一个 ActionListener,它将目标对象的 "label" 属性设置为事件源的 "text" 属性的值("source" 属性的值)。

EventHandler.create(ActionListener.class, myButton, "label", "source.text")

这将对应于以下内部类实现:

//Equivalent code using an inner class instead of EventHandler.
new ActionListener {
    public void actionPerformed(ActionEvent e) {
        myButton.setLabel(((JTextField)e.getSource()).getText()); 
    }
}

可以使用以 "." 字符分隔的任意数量的属性前缀来“限定”事件属性。采用出现在 "." 字符前面的“限定”名称作为将应用于事件对象的属性名称,最左边的最先应用。
例如,以下动作侦听器

EventHandler.create(ActionListener.class, target, "a", "b.c.d")

可以写成以下内部类(假定所有属性都有规范的获取方法并返回适当的类型):

//Equivalent code using an inner class instead of EventHandler.
new ActionListener {
    public void actionPerformed(ActionEvent e) {
        target.setA(e.getB().getC().isD()); 
    }
}

也可以使用以 "." 字符分隔的任意数量的属性前缀来“限定”目标属性。例如,以下动作侦听器:

EventHandler.create(ActionListener.class, target, "a.b", "c.d")

可以写成以下内部类(假定所有属性都有规范的获取方法并返回适当的类型):

//Equivalent code using an inner class instead of EventHandler.
   new ActionListener {
     public void actionPerformed(ActionEvent e) {
         target.getA().setB(e.getC().isD()); 
    }
}

由于 EventHandler 最终依赖反射来调用方法,所以建议不要以重载方法为目标。例如,如果目标是类 MyTarget 的一个实例,而 MyTarget 定义如下:

public class MyTarget {
     public void doIt(String);
     public void doIt(Object);
   }

那么方法 doIt 被重载。EventHandler 将基于源调用恰当的方法。如果源为 null,那么两个方法都可以,具体调用哪个方法是不确定的。因此,建议不要以重载方法为目标。

更多相关知识,请访问:PHP中文网

위 내용은 객체는 어떤 행동을 인식하고 반응할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.