본문

JFace MenuManager 사용하기 #1. 프로그램 상단메뉴 추가


JFace MenuManager는 SWT 메뉴의 생성과 업데이트를 쉽게 할 수 있도록 도와줍니다. MenuManager는 아이템, 또다른 MenuManager(하위메뉴를 위해), 그리고 분리자를 포함할 수 있습니다. MenuManager는 바메뉴, 팝업메뉴, 드랍다운 메뉴등으로 표현될 수 있습니다. 뷰어(viewer)에서와 마찬가지로, MenuManager는 SWT 메뉴 자체에 대해 직접적인 접근을 요하지 않는, '헬퍼객체'라 할 수 있겠습니다. MenuManager뿐만 아니라 버튼, 툴바객체에도 액션(Action)을 추가할 수 있으며, 이는 ① Action을 상속받는 서브클래스를 만들고, ② 메뉴/툴바/버튼에 나타나고자 하는 텍스트를 설정하고, ③ run() 메소드를 구현함으로서 원하는 작업을 할 수 있습니다. 

아래의 코드를 확인해보세요. Exit에서 x앞에있는 &문자는 x가 해당 메뉴 아이템의 바로가기 키(포커스를 옮겨주는 역할)라는 것을 나타내줍니다. 이는 단축키와는 다른 개념이며 단축키는 @뒤에 조합을 위치함으로서 설정이 가능합니다(Ctrl+W). 물론 단축키를 직접 설정하는 메소드도 존재합니다. setToolTipText()로 툴팁(마우스를 올려놓았을때 나오는 노란색 설명)을 설정할 수 도 있으며 메뉴 좌측에 위치하는 메뉴 설명 그림 또한 setImageDescriptor()으로 추가할 수 있습니다. 단 메뉴 설명 그림이 추가된 경우 메뉴 아이템에 툴팁이 보이지 않겠지만, 이는 ToolbarItems를 통해서 사용 가능합니다  

단, 자세히 보신분은 눈치채셨겠지만 이 구현에서는 Action상에서 이미지 descriptor를 직접적으로 사용합니다. 실제로는 이미지 레지스트리에서 이미지 descriptor를 가져오는것이 좋겠지만, 문제는 이미지 레지스트리는 단지 이미지만을 반환하며 ImageDescriptor를 받을 수 없다는 것입니다. 이 버그는 이클립스 버그 데이터베이스 23555 에 기록되어있습니다.


import org.eclipse.jface.action.*;
import org.eclipse.jface.window.*;
import org.eclipse.jface.resource.*;
import org.eclipse.swt.*;

public class ExitAction extends Action {
    ApplicationWindow window;

    public ExitAction(ApplicationWindow w) {
        window = w;
        setText("E&xit@Ctrl+W");
        setToolTipText("Exit the application");
        setImageDescriptor(ImageDescriptor.createFromURL(Util.newURL("file:icons/close.gif")));
    }

    public void run() {
        window.close();
    }
}


Action을 상속받는 클래스 만들기
Action에 getText()가 정의되어있다는 사실때문에 혼동될 수 있지만, 이것을 오버라이드하려는 것이 아닙니다. 대신, Action은 setText(String)을 통해서 text값을 받아와 저장하며, Action을 사용하는 모든 SWT 컨트롤에 대해서 주어진 새로운 텍스트값을 갖도록 한다는것을 알아야 합니다. 이 사항은 툴팁 텍스트, 활성화 상태등과같은 모든 Action 속성에 적용되는 사항이며, 이에 대해서는 다음에 살펴보겠습니다.

어플리케이션 윈도우에 메뉴바 추가하기
이제 어플리케이션 윈도우(ApplicationWindow)에 addMenuBar()를 통하여 메뉴바를 추가하는 작업을 해보겠습니다. 기억해야 할 사항은, 이 작업은 SWT shell이 만들어지기 이전에 실행되어야 한다는 것입니다. 또한 이는 어플리케이션 윈도우에 들어있는 메소드인, createMenuManager()를 통해 작업이 이루어지며, 이 메소드의 리턴값으로 MenuManager가 반환됨으로서 SWT 메뉴바를 만드는데 사용되게 될것입니다. 아래 코드에서, 하위 MenuManager가 add()되지 않은 메뉴는 자동으로 비활성화 상태로 변하며, 또한 Alt+F, x를 누름으로서 어플리케이션을 닫으실 수 있습니다.


protected MenuManager createMenuManager(){
    MenuManager bar_menu = new MenuManager("");
    MenuManager file_menu = new MenuManager("&File");
    MenuManager edit_menu = new MenuManager("&Edit");
    MenuManager view_menu = new MenuManager("&View");

    bar_menu.add(file_menu);
    bar_menu.add(edit_menu);
    bar_menu.add(view_menu);

    file_menu.add(new ExitAction(this));
    return bar_menu;
}

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.