SWT/JFace 프로그래밍
모델 기반 어댑터 ( JFace 어댑터 )
자바에서 어댑터는 위젯에 추가적인 이벤트 처리기능을 제공하는 클래스입니다.
JFace 어댑터의 종류
- 뷰어(Viewer) 클래스
SWT에서는 GUI 구성 요소의 정보와 외양을 함께 묶어서 표현합니다. 하지만 뷰어(Viewer)는 이러한 두 측면을 분리하여 동일한 정보가 서로 다른 양식으로 보이도록 합니다.
- 액션(Action) 과 컨트리뷰션(Contribution)
이러한 어댑터는 이벤트 처리를 단순화하여 사용자 명령에 대한 응답과 응답을 일으키는 GUI 이벤트를 분리합니다.
- 이미지와 폰트 레지스트리
SWT에서 폰트와 이미지의 할당을 최소로 유지하는 것이 중요합니다. 왜냐하면, 폰트와 이미지는 운영체제의 자원을 요구하기 때문입니다. 하지만 JFace에 등록함으로써 자원이 필요할 때만 할당하고 할당을 해제할 수 있습니다. 그러므로 여러 개의 이미지와 폰트를 사용하더라도 가비지 콜렉션(Garbage Collection)을 그다지 고려할 필요는 없습니다.
- JFace 대화상자와 마법사
이 그룹은 SWT 대화창의 기능을 확장합니다. JFace는 에러를 보여주는 메시지 혹은 현재 프로세스의 진행을 보여주는 대화창을 보여줍니다. 덧붙여 JFace는 마법사라고 불리는 특정 대화창을 제공하는데, 이 마법사는 여러 작업의 그룹을 제공하여 사용자를 안내하는 역할을 합니다.
HelloSWT_JFace 프로그램
JFace 라이브러리를 사용하는 프로그램 예제입니다.
<에제 코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package com.swtjface.Ch2;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
/**
* 2010.05.17
* HelloSWT_JFace 프로그래밍 예제
* 참조 : SWT/JFace in Action
* @author cremazer
*/
public class HelloSWT_JFace extends ApplicationWindow {
/*
* ① 윈도우 할당
*/
public HelloSWT_JFace() {
super(null);
}
/*
* ② 윈도우 보임
*/
protected Control createContents(Composite parent) {
Text helloText = new Text(parent, SWT.CENTER);
helloText.setText("Hello SWT and JFace!");
parent.pack();
return parent;
}
/*
* ③ 윈도우 작동
*/
public static void main(String[] args) {
HelloSWT_JFace helloJface = new HelloSWT_JFace();
helloJface.setBlockOnOpen(true);
helloJface.open();
Display.getCurrent().dispose();
}
}
|
<실행 결과>
<에러 발생시>
java.lang.ClassNotFoundException: org.eclipse.core.runtime.IProgressMonitor 를 참고하세요.
<메서드 설명>
① HelloSWT_JFace() - 생성자
생성자는 메인 클래스의 인스턴스를 생성합니다. 윈도우에 할당하는 동안 필요한 환경 설정이나 통신 작동들은 여기에 작성합니다.
② createContents()
윈도우가 어떻게 보일 것인지를 설계하는 부분입니다. ApplicationWindow의 가시적인 부분은 바로 접근할 수 없기 때문에, 해당 메서드는 Composite라는 위젯 컨테이너를 통해서 GUI의 외양을 관리합니다. 해당 컨테이너 객체는 GUI 구성요소의 최상위 부모로써 GUI 컴포넌트를 애플리케이션에 추가합니다. 결국 위젯을 생성, 배치하고 부모(parent)에 추가한 다음, 해당 Composite를 화면에 보일 메인 윈도우로 반환합니다.
③ main()
main() 는 GUI의 실제 작동을 관리합니다. 즉, 윈도우가 나타나도록 실행하는 메인메서드입니다.
- setBlockOnOpen(true) : ApplicationWindow를 위한 자원을 할당한 후에, 윈도우를 닫을 때까지 해당 윈도우만 보이도록 설정합니다.
- open() : createContennts() 메서드에서 반환하는 Composite에 따라 윈도우를 디스플레이합니다. open() 메서드의 다음 실행코드는 윈도우를 닫고나서 작용합니다.
- dispose() : GUI의 Display 인스턴스의 할당을 해제합니다.
SWT와 SWT/JFace 의 차이점
SWT에서는 Shell 클래스에서 GUI의 외양과 동작을 함께 기술하는 반면에, SWT/JFace는 GUI의 외양과 동작을 분리합니다. 이런 모듈화된 구조로 코드를 재사용 할 수 있고, 한 개발자가 윈도우 뷰를 설계하면서 다른 개발자는 윈도우 동작을 구현할 수 있습니다.
ApplicationWindow 클래스
ApplicationWindow는 Shell 클래스에서 JFace 어댑터로서 동작하며 두 가지 이점을 줍니다.
- ApplicationWindow는 GUI의 외양과 동작을 분리합니다.
- 설계자에게 유용한 윈도우를 설정하는 여러방법을 제공합니다.
Shell 클래스는 크기와 스타일을 변경하는 메서드를 가지고 있지만, ApplicationWindow 클래스의 메서드를 사용해서 훨씬 더 편리하게 설정시킬 수 있습니다. 이러한 메서드는 윈도우가 메뉴바, 툴바, 상태표시줄을 포함하도록 신속하게 처리할 수 있습니다. 또한 애플리케이션의 예외 처리와 디폴트 이미지를 설정할 수 있습니다. SWT에서는 이런 기능들을 각각의 쉘에 대해 제공하고 설정해야 하지만, JFace에서는 자동으로 처리해줍니다.
SWT/JFace 어플리케이션 클래스관계
ApplicationWindow 클래스의 환경 설정 메서드
WidgetWindow 애플리케이션 시작하기
WidgetWindow 설계의 복잡성을 줄이기 위해 다음 코드를 사용하여 기본 윈도우를 만듭니다.
<예제 코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package com.swtjface.Ch2;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
/**
* 2010.05.17
* WidgetWindow 생성
*
* @author cremazer
*/
public class WidgetWindow extends ApplicationWindow {
/**
* 윈도우 할당
*/
public WidgetWindow() {
super(null);
}
/**
* 윈도우 뷰
*/
protected Control createContents(Composite parent) {
//윈도우 제목 설정
getShell().setText("Widget Window");
//윈도우 크기 설정
parent.setSize(400, 250);
return parent;
}
/**
* 윈도우 실행
* @param args
*/
public static void main(String[] args) {
WidgetWindow wwin = new WidgetWindow();
wwin.setBlockOnOpen(true);
wwin.open();
//윈도우 종료(닫기) 후 실행
Display.getCurrent().dispose();
}
}
|
<실행 결과>
지금까지 SWT를 이용하여 윈도우를 생성하는 방법과 SWT/JFace를 생성하는 방법을 비교하여 보았습니다. SWT와 JFace에서 사용하는 라이브러리는 특정 플랫폼 자원을 플랫폼에 무관한 방법으로 접근하기 때문에, 이 접근을 가능하게 하는 객체를 이행하는 것이 중요합니다. 이제 윈도우를 생성하는 방법을 알았으니, 윈도우에 실제 위젯을 올려보면서 어떻게 작동하는지 사용법을 알아봅시다.
참고 서적 : SWT/JFace in Action
댓글 없음:
댓글 쓰기