2012-09-17 2 views
8


제목이 유감스러운 것은 아마도 너무 일반적인 것입니다.ActionListener 모범 사례

이미 자바로 How to Write an Action Listener 튜토리얼을 읽었는데 이미 this question을 읽었지 만 여전히 몇 가지 의구심이 있습니다. 동일한 작업을 여러 번 수행해야 할 때 가장 좋은 솔루션이 무엇인지 궁금합니다.

동일한 ActionListener을 재사용하고 싶지만 최선의 방법 (코드 가독성, 코드 mantainability, 성능 및 코드 스타일)에서이를 달성하는 방법을 잘 모르겠습니다.

먼저 (나는 액션 청취자 재사용하지 않을거야 경우 내가 사용하는 것) "표준"코드 :

btnMenu.addActionListener(
    new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Navigator.showMenu(); 
     } 
    } 
); 

내가 OBV 아무것도를 다시 사용할 수 없습니다이 방법은 내부 익명이기 때문에, 클래스 ... 이제

, 나는 다음과 같은 솔루션을 생각할 수 있습니다 :

  1. 스토어 필드에 익명의 내부 클래스의 참조 (즉, 가장 가능성이 static final 될 것입니다);
  2. ActionListener 인터페이스를 구현하는 새 클래스를 작성하십시오. 솔루션 2

    public static final MENU_ACTION_LISTENER = new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         Navigator.showMenu(); 
        } 
    }; 
    
    btnMenu.addActionListener(MENU_ACTION_LISTENER); 
    

    예제 코드 : 솔루션 1

예제 코드

  1. 저장하기 :

    // package-private, only GUI-package classes should be able to use it. 
    // most likely I won't ever need to subclass it, so why not making it final? 
    final class MenuActionListener implements ActionListener { 
        public void actionPerformed(ActionEvent e) { 
         Navigator.showMenu(); 
        } 
    } 
    
    // now, wherever I need to use it: 
    btnMenu.addActionListener(new MenuActionListener()); 
    

    나는 두 솔루션에 대한 몇 가지 의심이 익명 액션 리스너에 대한 언급? 나는 어떤 종류의 유틸리티 클래스 (예 : ActionListenersUtil)를 저장할 수 있습니다. 모든 작업 리스너를 저장하고 싶습니다. static final 필드에서 재사용하고 싶지만, 마음에 들지 않습니다 ... 저를 가난한 디자인으로 보입니다.

  2. 는 내가 모든 별도의 패키지에 청취자 (예 : GUI 요소에 대한 com.myapp.guicom.myapp.gui.listeners을 가지고 싶습니다 ... 내가 처음에 패키지에 대한 몇 가지 의심을했다 ... 더 의미가 아마 가장 잘 Command Pattern 다음합니다 그러나 내가 이것을 썼을 때 나는 선택의 여지가 없다는 것을 깨달았습니다. 그것이 의미가있는 유일한 장소는 (같은 이되어야합니다.) 주문을 위해서라도 그것들을 모두 별도의 패키지에 넣어 두는 것이 좋습니다. GUI가 변경된 경우에도 대부분의 작업 수신기가 재사용 될 수 있기 때문에 여전히 의문입니다.

또 다른 질문 : btnMenu.addActionListener(MENU_ACTION_LISTENER);btnMenu.addActionListener(new MenuActionListener()); (JVM, 클래스 로딩, 클래스 컴파일, 각 클래스에서 차지하는 메모리, 가비지 수집 등)의 차이점은 무엇입니까?

도와주세요. 지금 당황하고 있습니다! :(

답변

14

가장 좋은 방법은 ActionListener 대신에 Action을 버튼, 메뉴 등에 첨부해야합니다.ActionJButton의 모델이며, 모델은

을 공유하기위한 것입니다 이것은 또한 당신에게 텍스트, 아이콘을 변경하는 기능, 사용 가능 상태 및 Action가 부착 된 모든 버튼의 다른 속성을 제공

동시에 여러 번 전화하지 않아도됩니다. 또한 메뉴 항목 등에 잘 붙일 수 있습니다.

Action을 만들려면 처음부터 다시 시작할 필요가 없습니다. AbstractAction은 좋은 출발점입니다. Swing Action tutorial도 좋습니다.

+3

+1 이렇게하면 여러 통화를하지 않고 '동작'이 연결된 모든 버튼의 텍스트, 아이콘, 사용 가능 상태 및 기타 속성을 변경할 수 있습니다. 또한 메뉴 항목 등에 잘 붙일 수 있습니다. – Brian

+1

+1000 만약 내가 할 수 ... ...-) –

+0

@ 브라이언 아주 좋은 발언. 답변을 복사하여 붙여 넣어 더 완벽하게 만들었습니다. – Robin