JFace Event처리 (Action and Contribution)



SWT에서 제공하는 이벤트 처리와는 달리 JFace에서는 Action과 Contribution이라는 개념을 제공한다. 책에서는 관련된 설명이 아주 복잡하게 나와있지만, Action은 이벤트 리스너 처럼 이벤트 핸들링하는 기능을 제공하는 클래스이고, ContributionItem은 GUI컴포넌트와 Action을 연결해주는 매게가 되는 역할을 한다. 다만, Contribution은 SWT처럼 다양한 컴포넌트 위젯을 지원하는 대신 Button, Menu, Toolbar 형태의 컴포넌트만 지원한다.


Action과 Contribution을 사용하는 방법은 두 가지이다. 하나는 ContributionManager를 이용하는 방법이고, 하나는 ContributionItem을 통해서 직접 명시적으로 등록하여 사용하는 방법이다.


개인적인 생각으로는 Button을 생성하는 경우를 제외하고는 ContributionManager를 통해서 Menu와 ToolBar를 등록하여 주는 것이 깔끔하고 간결한 코딩이 될 것 같다. 또한 ContributionManager에 등록시는 직접 CotnributionItem을 등록하는 것 보다는 Action을 등록하여 Action에 대한 재사용성을 높이는 것이 합리적일 것 같다.


ContributionManager를 이용하여 ApplicationWindow에서 자동등록

ContributionManager는 ContributionItem을 담는 컨테이너이다. ApplicationWindow에서 제공하는 MenuManager, ToolbarManager 객체에 .add()로 ContributionItem을 등록 별도의 작업 불필요. add() 메소드는 ContributionItem, Action을 받을 수 있도록 오버로드 되어있다.

<참고사항>

ContributionManager.add(ContributionItem) : ContributionItem 인자로 사용된 객체는 재사용불가.

ContributionManager.add(Action) : Action객체 재사용가능. (다른 ContributionManager에서 Action별도 생성 필요없음)



ContributionItem을 생성하여 Menu, Toolbar, Composite에 객체에 집접등록

ContributionItem을 생성하고 .fill()메소드를 호출하며 Menu, Toolbar, Composite을 넘기는 경우 등록된다.

이 경우 화면에 표시되는 STYLE는 메뉴, 툴바, 버튼으로 등록되는 경우마다 다른 모양을 보인다.

 ContibutionItem 주요 메소드 

 설명

 fill(Composite)

 Action의 STYLE 속성을 따라서 Button을 보여준다.

 fill(Menu, index)

 index 위치로 표시한 MenuItem을 등록한다.

 fill(ToolBar, index)

 index 위치로 표시한 ToolBarItem을 등록한다.

 getWidget()

 자동으로 생성 된 GUI요소인 Widget객체를 리턴한다.

 


Action 클래스 생성

[SampleAction] (아래 제공되는 예제는 SampleAction클래스를 기반으로 수행된다.)

ο org.eclipse.jface.action.Action을 상속받아 구현한다.

ο super(String, int)를 통해서 스타일을 결정한다.

┗ 첫번 째 인자는 Menu로 등록될 때 사용, 두번째 인자는 Button으로 사용 시

ο setToolTipText(String)은 Toobar로 사용되는 경우 ToolTip으로 사용된다.

ο run()메소드는 사용자가 버튼, 메뉴, 툴아이템 클릭되었을 때 동작하는 이벤트 핸들러.

ο 이벤트를 발생시킨 위젯에 접근하는 방법은 제공하지 않는다. (SWT Event의 e.source 같은 메커니즘은 없다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package actions;
 
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
 
public class SampleAction extends Action {
    
    // 생성자
    public SampleAction() {
        super("&누르세요@Ctrl+T", AS_PUSH_BUTTON);
        setToolTipText("툴팁입니다.");
        setImageDescriptor(ImageDescriptor.createFromFile(this.getClass(), "eclipse32.gif"));
    }
    
    // 이벤트 처리 핸들러 
    public void run(){
        System.out.println("버튼이 눌렸습니다.");
    }
    
}
cs



ContributionManager를 통해 Menu, Toolbar 등록

ContributionManager는 ContributionItem을 모아둘 수 있는 ApplicationWindow는 ContriButionItem을 담을 수 있는 MenuManager, ToolbarManager를 제공한다. Override메소드 등 createMenuManager(), createToolBarManager()를 확인 해 보자.


[메뉴 등록하기]

ο SampleAction객체를 생성

ο SampleAction겍체를 인자로 ActionContributionItem객체 생성

ο ApplicationWindow에서 제공하는 MenuManager에 ActionContributionItem add

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
protected MenuManager createMenuManager() {
    SampleAction sampleAction = new SampleAction();
    ActionContributionItem menuContriButionItem = new ActionContributionItem(sampleAction);
        
    // 메뉴 상하위 구조 지정
    MenuManager parentMenuManager = new MenuManager(null);
    MenuManager mainMenuManager = new MenuManager("Main");
    parentMenuManager.add(mainMenuManager);
        
    // Main menu하위에 menuContriButionItem 추가
    mainMenuManager.add(menuContriButionItem);
    //mainMenuManager.add(sampleAction);
    return parentMenuManager;
}
cs


[툴바 등록하기]

ο SampleAction객체를 생성

ο SampleAction겍체를 인자로 ActionContributionItem객체 생성

ο ApplicationWindow에서 제공하는 ToolBarManager에 ActionContributionItem add

1
2
3
4
5
6
7
8
9
10
@Override
protected ToolBarManager createToolBarManager(int style) {
    SampleAction sampleAction = new SampleAction();
    ActionContributionItem toolBarContriButionItem = new ActionContributionItem(sampleAction);
    
    ToolBarManager toolBarManager = new ToolBarManager(style);
    toolBarManager.add(toolBarContriButionItem);
    //toolBarManager.add(sampleAction);
    return toolBarManager;
}
cs


<참고사항>

주석처리 된 mainMenuManager.add(sampleAction), toolBarManager.add(sampleAction) 역시 사용가능



ContributionItem.fill()을 통해 직접등록

메뉴와 툴바를 위에서 설명한 방법으로 등록할 수 있지만, Contributionitem에서 직접 등록하는 것도 가능하다. 그리고 Button의 경우는 ContributionItem.fill(Composite)을 통해서만 등록할 수 있다.


[메뉴 등록하기]

1
2
3
SampleAction sampleAction = new SampleAction();
ActionContributionItem menuItem = new ActionContributionItem(sampleAction);
menuItem.fill(getShell().getMenuBar(), 0);
cs


[툴바 등록하기]

1
2
3
SampleAction sampleAction = new SampleAction();
ActionContributionItem toolItem = new ActionContributionItem(sampleAction);
toolItem.fill(getShell().getToolBar(), 1);
cs


[버튼 등록하기]

1
2
3
4
5
6
7
8
9
10
Composite container = new Composite(parent, SWT.NONE);
 
SampleAction sampleAction = new SampleAction();
ActionContributionItem btnContriButionItem = new ActionContributionItem(sampleAction);
btnContriButionItem.fill(container);
 
// ContributionItem이 자동생성한 Widget을 획득하여 pack
((Control)btnContriButionItem.getWidget()).pack();
 
container.pack();
cs



다운로드

JFaceActionContribution.zip



이 글을 공유하기

댓글

Email by JB FACTORY