액션 청취자를 프로그래밍하는 일반적인 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2434331

  •  19-09-2019
  •  | 
  •  

문제

방금 액션 리스너를 사용하는 방법을 배우기 시작했습니다. 내 이해를 위해 다음과 같은 방식으로 작동합니다.

  1. 기본적으로 "addActionListener"메소드가 포함 된 일부 클래스가 있습니다 (예 : 버튼 클래스).

  2. 이 방법을 사용하여 객체에 액션 리스너를 추가합니다. 예를 들어: listenedObject.addActionListener(listeningObject).

  3. "ListenDobject"가있는 동작이 수행되면 "ListenoBject"의 "ActionPerformed"메소드가 호출됩니다. 따라서 LiskingObject의 클래스를 프로그래밍 할 때 "ActionPerformed"메소드를 넣어야합니다.

나에게 분명하지 않은 것은 우리가 듣고 싶은 모든 객체에 대한 새로운 클래스를 만들면 나에게 분명합니다. 그것은 나에게 우아한 솔루션으로 보이지 않습니다. 반면에,이 클래스의 인스턴스가 어떤 객체가 "actionperformed"메소드를 호출하는지 알지 못하기 때문에 모든 (또는 적어도 많은) 객체에 대해 하나의 액션 청취자 클래스가있는 경우 (그리고 우리는 ActionPerformed가 수행 한 작업 이이 방법을 요구하는 사람에 따라 다릅니다).

제 생각에, 우리가 만들어야 할 모든 청취 대상에 대해 "개인"액션 리스너이며 해당 액션 리스너의 해당 필드에 특정 값을 설정하여이를 수행 할 수 있습니다. 그러나 그것이가는 표준 방법인지 확실하지 않습니까? 보통 사람들은 어떻게해야합니까?

도움이 되었습니까?

해결책

이것을 다루는 가장 일반적인 방법 - 내 개인적인 경험으로 판단하는 것은 단순히 익명의 인라인 클래스를 만드는 것입니다. 이와 같이:

listenedObject.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        // Your action handling code in here
    }
});

그리고 나는 종종 사람들이 듣는 도체가 포함 된 대상의 방법으로 전화를 걸었다는 것을 보았습니다. 예를 들어, 버튼이있는 대화 상자에서 다음과 같습니다.

myOkayButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        okayButtonPressed();
    }
});

그런 다음 나중에 대화 상자 수업 :

private void okayButtonPressed() {
    // Do what we need to do
}

다른 팁

Personaly, 가능하면 나는 동작 클래스 (예 : 서브 클래스 AbstractAction) 단순히 액션 리스너에 의존하는 대신. 이런 식으로, 나는 원래의 위젯에 이름, 아이콘, 툴팁 등을 제공 할 수 있습니다 ...

내가 항상 유용하다고 생각한 방식 ( 항해 목적)는 익명의 내부 클래스를 만들어 외부 클래스를 위임하는 것입니다.

listenedObject.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        listenedObject_actionPerformed(evt);
    }
});


private void listenedObject_actionPerformed(ActionEvent evt) {
    //Your handling goes here
}

그런 다음 구조적 조회 (아이디어의 Ctrl+F12, Eclipse의 Ctrl+O)를 사용하여 IDE에서 처리 코드를 얻는 것이 훨씬 쉽습니다.

단일 클래스 사용 문제 (GUI와 같은 MyCoolPanel) 많은 구성 요소 (버튼 등)의 공통 청취자로서 actionPerformed 그런 다음 방법은 못 생겼습니다 if-else 알아 내기위한 비교 어떤 버튼 실제로 압박을 받았습니다.

당신은 분명히 지나치게 걱정해서는 안됩니다 성능 이런 종류의 측면 - 그들은 극단적으로 무시할 수 있습니다! 조기 최적화는 유명합니다 나쁜 것

내가 항상 유용한 것을 발견 한 방식은 ActionListener 인터페이스를 구현하는 별도의 클래스와 작업을 수행하는 데 필요한 다른 모든 방법을 만드는 것입니다. 이런 식으로 액션은 특정 객체에 묶여 있지 않으며 버튼, 메뉴 등에서 트리거 될 수 있습니다. 명령 패턴 나는 추측한다. 코드를 간단하게 유지합니다.

익명의 클래스는 재사용 할 수 없습니다.

듣는 도체가 포함 된 물체로의 리디렉션은 유지하기 어려운 거대한 클래스로 이어집니다.

메소드 제거 방법은 이유가 있기 때문에 존재합니다. 듣는 객체가 이벤트를 처리하는 객체로 죽을 경우 청취자 정리를 건너 뛸 수 있습니다. 그러나 구성 요소가 외부 소스에서 제공되는 모델을 장려하면 AddNotify에 리스너를 추가하고 제거해야합니다. 그렇지 않으면 Memore가 누출 될 수 있습니다.

아마도 지금은 그렇지 않을 수도 있지만 가장 가까운 미래 (Java 7 릴리스 이후)에서 이와 같은 것이 일반적인 방법이라고 생각합니다.

listenedObject.addActionListener ( #{doSmth();} );
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top