2011-06-10 2 views
3

NetBeans 7.0의 "새 동작"마법사는 ActionListener 인터페이스를 구현하는 클래스를 생성하며 몇 가지 주석이 있습니다. 이 주석은 마법사에 지정된 도구 모음/메뉴에이 작업에 대한 참조를 배치합니다. 이것의 대부분은 NetBeans wiki에서 설명하고 예상대로 작동합니다.NetBeans 선언적 동작 등록 대 노드 팝업 메뉴

노드의 컨텍스트 메뉴에 이러한 동작을 추가하려고 할 때 문제가 발생합니다. 여기에 작업 표시는 Node.getActions(..) 메서드에서 구체적인 작업 인스턴스를 반환해야 함을 의미합니다. 누락 된 부분은 여기에 멋진 주석이있는 ActionListener이 있지만이 리스너가 뒷받침하는 Action 인스턴스가 필요합니다. 어떻게 든 관련 보인다 블로그 post by Geertjan, 우연히이 격차를 채우기 위해 노력하고 내 ActionListener에 추가 한 정적 방법을 주도 할 때이 작동하는 동안

public static Action findAction() throws Exception { 
    final FileObject fo = FileUtil.getConfigFile(
      "Actions/Tools/foo-bar-Action.instance"); 

    final DataObject dob = DataObject.find(fo); 
    final InstanceCookie ic = dob.getLookup().lookup(InstanceCookie.class); 

    if (ic != null) { 
     final Object instance = ic.instanceCreate(); 
     if (instance instanceof Action) { 
      return (Action) instance; 
     } 
    } 

    return null; 
} 

, 그것은 확실히의 가장 아름다운 조각 아니다 코드와 파일 시스템 API 및 그 추악한 액션 이름 문자열 상수를 통과하는 코드. 나에게는 매우 부서지기 쉬운 것처럼 보입니다.

마법사의 생성 된 동작을 노드의 상황에 맞는 메뉴로 가져 오는 가장 좋은 방법은 무엇입니까? 그게 중요하다면 내 작업은 컨텍스트 인식 (그래서 그것은 특정 인터페이스를 활성화해야합니다)에 언급하고 싶습니다.

답변

2

actionsForPath (String path)라고하는 org.openide.util.Utilities에 유틸리티 메소드가 있습니다. 이 사용하여, 나는이 노드에 다음과 같은 뭔가 위의 코드를 대체 할 것이다 : 이것은 (이 경우)에 등록 된 작업 도구를 모두 반환됩니다

import org.openide.util.Utilities; 
... 
public static final String FOO_CLASS_PATH = "Actions/Tools"; 
... 
@Override 
public Action[] getActions(boolean context) { 
    List<? extends Action> actions = Utilities.actionsForPath(FOO_CLASS_PATH); 
    return actions.toArray(new Action[actions.size()]); 
} 

. Action 클래스에서 @ActionID 또는 @ActionReferences 주석을 사용하여 노드 특정 작업을 특정 노드의 범주에 배치하려고합니다.

getPreferredAction()과 같이 하나의 특정 Action 인스턴스 만 지정하려면 전체 인스턴스 경로를 포함하고 List의 첫 번째 요소 만 반환하십시오.