IBM Korea Skip to main content
       IBM 홈    |  제품 & 서비스  |  고객지원 & 다운로드  |  회원가입  

IBM developerWorks > 자바
developerWorks

Eclipse Workbench 밖에서 Eclipse GUI 사용하기, Part 1 :
스탠드얼론 모드에서 JFace와 SWT 사용하기

간단한 파일 탐색 애플리케이션 만들기

Level: Intermediate

Adrian Van Emmenis
독립 컨설턴트
2003년 1월 23일

Eclipse GUI 컴포넌트(JFace & SWT)가 Eclipse Workbench 내부에서 종종 사용되고는 있지만, 원래는 독립(self-contained) 프레임웍으로서 설계되었다. Eclipse Workbench 외부에서도, JFace의 플러그 가능한 디자인으로 놀랍도록 적은 코드를 사용하여 세련된 GUI를 만들 수 있다. 이 시리즈를 통해 스탠드얼론 애플리케이션을 구현하는 방법을 제시할 것이다. Part 1은 "Hello, World" 예제로 시작한다.

Introduction
오픈 소스 Eclipse 프로젝트는 자바 분야에 있어서 최근 가장 흥미로운 개발 프로젝트중 하나이다. Eclipse는 그 자체로 "일종의 범용 툴 플랫폼--개방된 확장가능한 IDE"로서 설명된다. (Eclipse Platform 시작하기 참조).

Eclipse의 중요 컴포넌트들 중에 SWT(그래픽 라이브러리)와 JFace(매칭 유틸리티 프레임웍)가 있다. 이 두 가지 컴포넌트를 집중적으로 다루겠다. Eclipse 웹 사이트의 Eclipse 기술 개관에는 다음과 같이 설명하고 있다:

  • SWT은 원시 윈도우 시스템에 통합된 위젯 세트와 그래픽 라이브러리이다. 하지만 OS 독립의 API 이다.
  • JFace는 일반적인 UI 프로그래밍 태스크를 간단하게하는 SWT를 사용하여 구현된 UI 툴킷이다. JFace는 API와 구현에 있어서 윈도우-시스템 독립적이며 이를 숨기지 않고 SWT와 작업할 수 있도록 설계되었다.

그림 1은 Eclipse, JFace, SWT의 관계를 나타낸 그림이다.

그림 1. Eclipse Workbench, JFace, SWT
Figure 1. Eclipse Workbench, JFace, and SWT

지금까지 JFace와 SWT를 다루었던 글 대부분은 큰 Eclipse 프레임웍에서 이들을 사용하는 관점에서 다뤄지고 있다. 이 글에서 나는 조금 다른 접근방식을 택하였다. 스탠드얼론 자바 프로그램에서 JFace와 SWT를 사용하는 방법을 설명할 것이다.

내가 선택한 예제는 파일 탐색기이다. 실제 기능들을 많이 구현하지는 않겠지만 완벽한 기능을 갖춘 프로그램이 어떻게 구현되는지를 이해할 수 있도록 충분한 GUI를 보여줄 것이다.

설치 note
예제용 소스코드를 다운로드 할 수 있다. 다음은 나의 시스템 설정 사항이다:

  • Windows 2000
  • Eclipse, stable build M3 (November 15, 2002)
  • Eclipse installed in C:\eclipse-2.1.0

여러분의 시스템에서 프로그램이 정확히 작동할 수 있도록 마음껏 커스터마이징 해도 좋다.

구현/실행 지침
클래스 경로에 다음과 같은 jar 파일이 필요하다:

C:\eclipse-2.1.0\plugins\org.eclipse.jface_2.1.0\jface.jar
C:\eclipse-2.1.0\plugins\org.eclipse.runtime_2.1.0\runtime.jar
C:\eclipse-2.1.0\plugins\org.eclipse.swt.win32_2.1.0\ws\win32\swt.jar
C:\eclipse-2.1.0\plugins\org.eclipse.ui.workbench_2.1.0\workbench.jar
C:\eclipse-2.1.0\plugins\org.eclipse.core.runtime_2.1.0\runtime.jar

다음 인자로 Java VM을 실행하여 Java VM이 런타임시 사용할 GUI에 맞는 공유 라이브러리를 선택했는지 확인한다:

-Djava.library.path=C:\eclipse-2.1.0\plugins\org.eclipse.swt.win32_2.1.0\os\win32\x86\

마지막으로 예제가 아이콘을 포함하고 있는 gif 파일을 찾을 수 있도록 icons 폴더를 포함하고 있는 폴더에서 프로그램을 실행한다.

Hello, World
내가 생각할 수 있는 가장 간단한 JFace 프로그램으로 시작해보자. "Hello, World" 프로그램이다.

Listing 1. Hello (version 1)

		
import org.eclipse.jface.window.*;
import org.eclipse.swt.widgets.*;

public class Hello
{
  public static void main(String[] args)
  {
    ApplicationWindow w = new ApplicationWindow(null);
    w.setBlockOnOpen(true);
    w.open();
    Display.getCurrent().dispose();
  }
}

메인 메소드가 ApplicationWindow를 만든 곳에 Hello라는 클래스가 생겼다. 이것을 연다. setBlockOnOpen()은 윈도우가 닫힐 때까지 open()을 막는다.

윈도우가 닫히면 현재 디스플레이가 생기고 이를 적절히 배치한다. 이것은 OS에 사용된 리소스를 내보낸다.

프로그램을 실행하면 그림 2 같은 윈도우를 보게된다:

그림 2. Hello (version 2)
Figure 2. Hello (version 2)

보이는 것이 전부다. "Hello, World"라는 것 조차 없다. 이를 픽스하기 전에 잠시 주제에서 벗어나 JFace 윈도우로 가보자.

JFace 애플리케이션 윈도우
윈도우는 상위 레벨 윈도우용 JFace 클래스이다. 다시말하면 OS 윈도우 매니저로 관리된다. JFace 윈도우는 상위 레벨 윈도우용 GUI 객체는 아니다. 대신 JFace 윈도우는 상응하는 SWT 쉘 객체를 알고있고 이를 구현 및 편집을 돕는 코드를 제공하며 이벤트를 듣는 역할을 하는 헬퍼 객체이다. 그림 3은 코드, JFace, SWT의 관계이다.

그림 3. 코드, JFace Window, SWT Shell 관계
The relationship between your code, a JFace Window and an SWT Shell

사실 이 모델은 JFace의 작동방법을 이해할 수 있는 열쇠이다. 이것은 SWT의 상단에 있는 레이어도 아니며 SWT을 숨기려는 시도도 하지 않는다. 대신 JFace는 SWT의 다양한 사용 패턴을 인식하고 있으며 이 패턴을 쉽게 프로그래밍할 수 있는 유틸리티 코드를 제공한다.

이를 위해 JFace는 사용하고 있는 객체나 하위클래스로 나눌 수 있는 클래스를 제공한다.

ApplicationWindow를 직접 사용했지만 그들은 실제로 특정 작동을 하위클래스로 나누고 특정 작동으로 채우도록 설계되었다. 메뉴 바, 툴바, 애플리케이션 스팩의 콘텐트를 삽입할 장소 상태 표시줄 등을 만들 수 있게 되어있다. 그림 4는 JFace File Explorer 이다.

그림 4. 애플리케이션 윈도우의 부분들
Figure 4. The parts of an Application Window

Hello를 다듬어서 ApplicationWindow의 하위클래스로 만든다. 변경된 라인은 Listing 2에 표시되어있다.

Listing 2. Hello (version 2)

		
import org.eclipse.jface.window.*;
import org.eclipse.swt.widgets.*;

public class Hello extends ApplicationWindow
{
  public Hello()
  {
    super(null);
  }

  public static void main(String[] args)
  {
    Hello w = new Hello();
    w.setBlockOnOpen(true);
    w.open();
    Display.getCurrent().dispose();
  }
}

여러분이 작성한 구조체는 하위클래스 구조체를 호출해야한다. 그 구조체에 대한 인자는 잠시 무시하자.

이를 실행한다고 해서 이전 프로그램과 달라진 것은 아무것도 없다. 디폴트는 데코레이션이 없다.

우리 프로그램에서는 "Hello, World" 텍스트가 들어있는 버튼을 만들것이다. 이 버튼은 콘텐트 부분에 나타난다. 이를 위해 Control createContents(Composite parent) 메소드를 만들어야한다.

ApplicationWindow는 모든 다른 위젯이 만들어진 후에 이를 호출할 것이다. 하지만 스크린에 윈도우가 디스플레이되기 전에 호출한다.

인자 부모는 현제 영역을 나타내는 복합 위젯이다.

복합 위젯을 만들고 이를 부모에 추가하고 그런 다음 자신의 위젯에 추가하고 여러분이 만든 복합 위젯을 리턴하는 개념이다. 그림 5는 인스턴스 계층이다.

그림 5. Application Window의 인스턴스 계층
Figure 5. The instance hierarchy of an Application Window

콘텐트는 매우 간단하다. 부모 밑에 하나의 버튼이 있다. (Listing 3)

Listing 3. Hello (version 3)

		
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class Hello extends ApplicationWindow
{
  public Hello()
  {
    super(null);
  }

  protected Control createContents(Composite parent)
  {
    Button b = new Button(parent, SWT.PUSH);
    b.setText("Hello World");
    return b;
  }

  public static void main(String[] args)
  {
    Hello w = new Hello();
    w.setBlockOnOpen(true);
    w.open();
    Display.getCurrent().dispose();
  }
}

결과는 그림 6 이다.

그림 6. Hello (version 3)
Figure 6. Hello (version 3)

JFace에 있는 우리의 첫 번째 "Hello, World" 프로그램이다: 윈도우에는 하나의 버튼이 포함되어 있다.

이제 파일 탐색기로 가보자. 우선 폴더 계층을 디스플레이할 트리 뷰어를 만들것이다.

TreeViewer 사용하기
ApplicationWindow와 마찬가지로 TreeViewer도 실제 SWT 위젯이 아니다. 또한 SWT 위젯을 숨기지도 않는다. SWT 위젯을 사용하여 아이템을 디스플레이하고 이를 도울 많은 객체들을 사용한다.

ApplicationWindow와는 다르게, JFace TreeViewer는 하위 클래스로 나뉘도록 되어있지 않다.

TreeViewer는 디스플레이할 트리의 뿌리(root) 엘리먼트를 알고 있다. 그 객체는 물론 TreeViewer: void setInput(Object rootElement)이다.

시작하기 위해서 뿌리 엘리먼트에 자식을 요청하고 그런 다음 그것을 디스플레이한다. 그런 다음 사용자가 자식 중 하나를 확장할 때, TreeViewer는 자식 용 노드를 요청하는 식으로 나간다. 실제로 이는 사실이 아니다. 트리 뷰어는 도메인 객체에게 직접 말하지 않는다. 대신 ContentProvider라는 또 다른 객체를 사용하고 이 객체는 당신의 도메인 객체를 사용한다. (그림 7).

그림 7. TreeViewer, ContentProvider, 도메인 객체
Figure 7. TreeViewer, ContentProvider and domain objects

물론 ContentProvider를 구현해야 한다. TreeViewer의 경우 클래스는 ITreeContentProvider 인터페이스를 구현해야 한다.

TreeContentProvider 구현하기
구현해야 할 메소드는 여섯 개다. 이중 세 개는 구현하지 않아도 된다.

다음은 트리 뷰어가 콘텐트 제공자에게 뿌리 엘리먼트 밑에 있는 상위 레벨 엘리먼트를 요청하는 방법이다:

ITreeContentProvider: public Object[] getElements(Object element)

그리고 특정 엘리먼트의 자식이 필요할 때 마다 다음을 사용한다:

ITreeContentProvider: public Object[] getChildren(Object element)

노드가 자식들을 갖고 있는지를 확인하려면 트리 뷰어는 노드의 자식들을 요청할 수 있고 그것이 몇 개 인지를 물을 수 있다. 코드가 이를 빠르게 수행할 수 있는 방법을 아는 경우에는 구현해야할 또 다른 메소드가 있다:

public boolean hasChildren(Object element)

보시다시피 콘텐트 제공자는 도메인 객체에 대한 레퍼런스를 갖고 있지 않다. 이것을 갖고 있는 것은 트리 뷰어이며 그들을 인자로서 콘텐트 제공자에 있는 각각의 메소드에 전달한다.

우리 같은 경우 노드는 File 객체이다. 자식을 얻기 위해서는 listFiles()를 사용한다. listFiles()가 null을 리턴하는지를 검사하고 그것을 빈(empty) 어레이로 전환해야한다.

뿌리 엘리먼트 바로 밑에 있는 상위 레벨 엘리먼트를 얻기 위해서는 getChildren() 메소드를 재사용할 수 있다.

getParent() 메소드는 reveal(Object element) 메소드를 구현하는데 사용되는데, 이것은 트리 뷰어가 트리 안의 특정 노드를 디스플레이하기 위해 SWT 트리 위젯을 스크롤하도록 한다. 그 노드가 그 상황에서 실제로 디스플레이되지 않는다면 어디에 디스플레이 되는지가 문제이다. JFace는 노드가 디스플레이될 때 까지 이것의 부모를 검색하고 그런 다음 부모의 부모를 검색하는 식으로 수행하고 타겟 노드가 디스플레이될 때까지 반복적으로 트래킹한다.

hasChildren() 메소드는 분명한 어떤 것을 수행하고 Listing 4의 코드로 끝을 맺는다.

Listing 4. FileTreeContentProvider (version 1)

		
import java.io.*;
import java.util.*;
import org.eclipse.jface.viewers.*;

public class FileTreeContentProvider implements ITreeContentProvider
{
  public Object[] getChildren(Object element)
  {
    Object[] kids = ((File) element).listFiles();
    return kids == null ? new Object[0] : kids;
  }

  public Object[] getElements(Object element)
  {
    return getChildren(element);
  }

  public boolean hasChildren(Object element)
  {
    return getChildren(element).length > 0;
  }

  public Object getParent(Object element)
  {
    return ((File)element).getParent();
  }
  
  public void dispose()
  {
  }

  public void inputChanged(Viewer viewer, Object old_input, Object new_input)
  {
  }
}

상위레벨의 Explorer 클래스 구현하기
Hello, World 프로그램을 가져다가 이것의 이름을 바꾸고 createContents() 메소드에 버튼을 만드는 대신 TreeViewer를 만들고 이것의 콘텐트 제공자를 파일 트리 콘텐트 제공자로 설정하고 폴더에 인풋을 설정한다. 이 경우 내가 선택한 폴더는 C: 드라이브에 있는 상위 레벨 폴더이다.

createContents()로 부터 SWT 위젯을 리턴할 것을 요청받았다는 것에 주목하자. 앞서 언급했듯이 JFace Tree Viewer는 SWT 위젯이 아니다. 따라서 이것을 리턴할 수 없다. 트리 뷰어에서 실제 위젯을 얻어야한다. getTree()를 사용하여 이를 수행한다.

메인 윈도우 클래스는 다음과 같다:

Listing 5. Explorer (version 1)

		
import java.io.*;

import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class Explorer extends ApplicationWindow
{
  public Explorer()
  {
    super(null);
  }

  protected Control createContents(Composite parent)
  {
    TreeViewer tv = new TreeViewer(parent);
    tv.setContentProvider(new FileTreeContentProvider());
    tv.setInput(new File("C:\\"));
    return tv.getTree();
  }

  public static void main(String[] args)
  {
    Explorer w = new Explorer();
    w.setBlockOnOpen(true);
    w.open();
    Display.getCurrent().dispose();
  }
}

이 프로그램을 실행하면 그림 8과 같이 된다.

그림 8. Explorer (version 1)
Figure 8. Explorer (version 1)

다른 코드들은 제쳐 두고 일단 9 번째 라인의 코드를 Hello, World 프로그램에 추가했어야 했다.

여러분도 같은 생각이겠지만 File에 있는 toString() 메소드를 사용하여 디스플레이된다. 이것은 우리가 원하던 것이 아니다. 이를 변경하려면 레이블(lable) 제공자가 필요하다r.

레이블 제공자 구현하기
트리 노드의 자식들을 얻는 콘텐트 제공자 객체가 있듯이 실제로 노드를 디스플레이 할 때 트리 뷰어는 또 다른 헬퍼 객체를 갖고있다. 바로 레이블 제공자(label provider)이다. 전과 같이 이를 설정해야한다:

public void setLabelProvider(IBaseLabelProvider labelProvider)

각 엘리먼트를 위해 디스플레이 할 텍스트를 리턴하기 위해 메소드를 구현해야 한다:

public String getText(Object element)

트리 뷰어를 위해 다이어그램에 레이블 제공자를 추가하면 그림 9와 같이 된다.

그림 9. 콘텐트 제공자와 레이블 제공자를 보여주는 Tree Viewer
Figure 9. Tree Viewer showing content provider and label provider

우리가 구현할 수 있는 인터페이스(ILabelProvider)가 있지만 기본 구현(LabelProvider)을 하위로 나누는게 더 쉽다.

getText()에서 실행하려는 것은 파일 이름의 마지막 부분을 리턴하는 것이다. Listing 6은 그 코드이다.

Listing 6. FileTreeLabelProvider (version 1)

		
import java.io.*;
import org.eclipse.jface.viewers.*;

public class FileTreeLabelProvider extends LabelProvider
{
  public String getText(Object element)
  {
    return ((File) element).getName();
  }
}

Listing 7 처럼 이 레이블 제공자를 트리 뷰어가 사용하도록 해야한다.

Listing 7. Explorer (version 2)

		
import java.io.*;

import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class Explorer extends ApplicationWindow
{
  public Explorer()
  {
    super(null);
  }

  protected Control createContents(Composite parent)
  {
    TreeViewer tv = new TreeViewer(parent);
    tv.setContentProvider(new FileTreeContentProvider());
    tv.setLabelProvider(new FileTreeLabelProvider());
    tv.setInput(new File("C:\\"));
    return tv.getTree();
  }

  public static void main(String[] args)
  {
    Explorer w = new Explorer();
    w.setBlockOnOpen(true);
    w.open();
    Display.getCurrent().dispose();
  }
}

이 프로그램을 실행하면 좀더 깨끗한 결과를 얻게된다. (그림 10).

그림 10. Explorer (version 2)
Figure 10. Explorer (version 2)

이제는 트리 뷰어를 왼쪽으로 옮기고 오른쪽에 테이블 뷰를 놓아 트리 뷰어에서 선택한 폴더에 있는 파일 리스트를 보이도록 한다.

테이블 뷰어(table viewer) 사용하기
JFace는 테이블을 핸들할 수 있는 TableViewer를 갖고있다. TreeViewer와 마찬가지로 인풋(루트 객체), 콘텐트 제공자, 레이블 제공자를 포함하고 있다. 트리를 다룰 필요가 없기 때문에 트리 뷰어보다 간단하다. 그림 11은 콘텐트 제공자와 레이블 제공자이다.

그림 11. 콘텐트 제공자와 레이블 제공자를 보여주는 테이블 뷰어
Figure 11. Table Viewer showing content provider and label provider

인풋 객체를 설정하는 메소드는 전과 같다:

TableViewer: void setInput(Object rootElement)

파일 테이블 뷰어 콘텐트 제공자 구현하기
콘텐트 제공자를 보자. 루트 엘리먼트는 트리 뷰어 루트 엘리먼트 보다 간단하다. 테이블 뷰어는 루트 객체가 많은 자식들을 갖고있을 것이라고 기대할 뿐이다. 따라서 구현할 재미있는 메소드는 자식들을 얻는 메소드이다:

public Object[] getElements(Object rootElement)

구현해야 하는 인터페이스는 IStructuredContentProvider 이다.

루트 객체는 폴더가 된다. 이것의 자식들은 그 폴더가 포함하고 있는 파일/폴더들이 될 것이다. 따라서 우리의 파일 테이블 콘텐트 제공자 클래스는 다음과 같다.(Listing 8)

Listing 8. FileTableContentProvider (version 1)

		
import java.io.*;

import org.eclipse.jface.viewers.*;

public class FileTableContentProvider implements IStructuredContentProvider
{
  public Object[] getElements(Object element)
  {
    Object[] kids = null;
    kids = ((File) element).listFiles();
    return kids == null ? new Object[0] : kids;
  }

  public void dispose()
  {
  }

  public void inputChanged(Viewer viewer, Object old_object, Object new_object)
  {
  }
}

이제 두 개의 뷰어(트리 뷰어와 테이블 뷰어)가 생겼다. 서로서로 옆으로 나란히 정렬하기 위해 SWT SashForm 위젯을 만든다. 이 위젯은 사용자가 조정할 수 있는 경계(border)로 이 자식들을 나눈다. 그런 다음 트리와 테이블을 sash form에 추가한다. (그림 12).

그림 12. 트리 뷰어와 테이블 뷰어를 포함하고 있는 sash form
Figure 12. The sash form contains the tree viewer and the table viewer

다음에 해야 할 일은 테이블 뷰어가 사용자가 트리 뷰어에서 선택한 각각의 폴더를 볼 수 있도록 만드는 것이다. 이를 위해서는 이벤트 듣기를 해야한다.

이벤트 듣기
사용자가 트리 뷰어에서 한 아이템을 선택할 때 트리 뷰어는 이벤트(SelectionChangedEvent)를 발생시킨다. 우리는 그 이벤트를 들어야하며 이벤트가 발생할 때 테이블용 인풋이 트리 뷰어에서 현재 선택된 파일이 되도록 설정해야한다.

트리 뷰에어서 발생한 선택 변경된 이벤트를 듣기 위해서 다음을 사용한다:

public void addSelectionChangedListener(ISelectionChangedListener?listener)

사용자가 트리 뷰어에서 노드를 선택/선택해제 할 때, 변경된 선택 리스너는 다음을 사용하여 호출된다:

public void selectionChanged(SelectionChangedEvent event)

이 리스너 클래스를 구현하려면 메인 Explorer Window에 많은 클래스를 코딩해야 한다. selectionChanged() 메소드에서 선택된 객체를 갖고 있어야 하며 이것을 테이블 뷰어용 인풋으로 만들어야한다. 이를 모두 모으면 Listing 9가 된다.

Listing 9. Explorer (version 3)

		
import java.io.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.widgets.*;

public class Explorer extends ApplicationWindow
{
  public Explorer()
  {
    super(null);
  }

  protected Control createContents(Composite parent)
  {
    SashForm sash_form = new SashForm(parent, SWT.HORIZONTAL | SWT.NULL);

    TreeViewer tv = new TreeViewer(sash_form);
    tv.setContentProvider(new FileTreeContentProvider());
    tv.setLabelProvider(new FileTreeLabelProvider());
    tv.setInput(new File("C:\\"));

    final TableViewer tbv = new TableViewer(sash_form, SWT.BORDER);
    tbv.setContentProvider(new FileTableContentProvider());

    tv.addSelectionChangedListener(new ISelectionChangedListener()
    {
      public void selectionChanged(SelectionChangedEvent event)
      {
        IStructuredSelection selection =
          (IStructuredSelection) event.getSelection();

        Object selected_file = selection.getFirstElement();
        tbv.setInput(selected_file);
      }
    });
    
    return sash_form;
  }

  public static void main(String[] args)
  {
    Explorer w = new Explorer();
    w.setBlockOnOpen(true);
    w.open();
    Display.getCurrent().dispose();
  }
}

이 프로그램을 실행하면 그림 13이 된다.

그림 13. Explorer (version 3)
Figure 13. Explorer (version 3)

트리 뷰어와 마찬가지로 테이블 뷰어위에 레이블 제공자를 설정하지 않는다면 디폴트 레이블 제공자를 사용하게된다. 기본 작동은 엘리먼트의 toString() 메소드에 의해 리턴된 스트링을 디스플레이한다. 절대적 파일 이름으로 디스플레이된다.

이제 테이블 레이블 제공자를 만들어보자.

테이블 레이블 제공자 구현하기
지금 현재 메소드 하나를 유의해야 한다:

public String getColumnText(Object element, int column)

두 개의 인자가 있다: 레이블을 얻는 엘리먼트와 (0으로 시작하는) 칼럼 인덱스 .

구현은 간단하다. 칼럼 인덱스 인자를 무시한다면 다음과 같다. (Listing 10).

Listing 10. FileTableLabelProvider (version 1)

		
import java.io.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.*;

public class FileTableLabelProvider implements ITableLabelProvider
{
  public String getColumnText(Object obj, int i)
  {
    return ((File) obj).getName();
  }

  public void addListener(ILabelProviderListener ilabelproviderlistener)
  {
  }

  public void dispose()
  {
  }

  public boolean isLabelProperty(Object obj, String s)
  {
    return false;
  }

  public void removeListener(ILabelProviderListener ilabelproviderlistener)
  {
  }
  
  public Image getColumnImage(Object arg0, int arg1)
  {
    return null;
  }
}

테이블이 "Name" 이라는 레이블이 있는 헤더를 가진 하나의 칼럼을 갖추도록 설정하려면 테이블 뷰어에서 테이블 위젯을 추출하여 테이블의 자식으로서 테이블 칼럼 위젯을 만들고 이에 대한 몇 가지 속성을 설정해야한다.(Listing 11).

Listing 11. Explorer (version 4)

		
import java.io.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.*;
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.widgets.*;

public class Explorer extends ApplicationWindow
{
  public Explorer()
  {
    super(null);
  }

  protected Control createContents(Composite parent)
  {
    SashForm sash_form = new SashForm(parent, SWT.HORIZONTAL | SWT.NULL);

    TreeViewer tv = new TreeViewer(sash_form);
    tv.setContentProvider(new FileTreeContentProvider());
    tv.setLabelProvider(new FileTreeLabelProvider());
    tv.setInput(new File("C:\\"));

    final TableViewer tbv = new TableViewer(sash_form, SWT.BORDER);
    tbv.setContentProvider(new FileTableContentProvider());
    tbv.setLabelProvider(new FileTableLabelProvider());

    TableColumn column = new TableColumn(tbv.getTable(), SWT.LEFT);
    column.setText("Name");
    column.setWidth(200);
    tbv.getTable().setHeaderVisible(true);

    tv.addSelectionChangedListener(new ISelectionChangedListener()
    {
      public void selectionChanged(SelectionChangedEvent event)
      {
        IStructuredSelection selection =
          (IStructuredSelection) event.getSelection();

        Object selected_file = selection.getFirstElement();
        tbv.setInput(selected_file);
      }
    });
    return sash_form;
  }

  public static void main(String[] args)
  {
    Explorer w = new Explorer();
    w.setBlockOnOpen(true);
    w.open();
    Display.getCurrent().dispose();
  }
}

이 모든 것을 수행한 후 결과는 그림 14와 같다.

그림 14. Explorer (version 4)
Figure 14. Explorer (version 4)

참고자료

목 차:
Introduction
Hello, World
JFace 애플리케이션 윈도우
TreeViewer 사용하기
TreeContentProvider 구현하기
상위레벨의 Explorer 클래스 구현하기
레이블 제공자 구현하기
테이블 뷰어(table viewer) 사용하기
파일 테이블 뷰어 콘텐트 제공자 구현하기
이벤트 듣기
테이블 레이블 제공자 구현하기
참고 자료
필자 소개
기사에 대한 평가
관련 dW 링크:
Part 2 of this series
Eclipse Platform 시작하기
Eclipse 플러그인 개발하기
Subscribe to the developerWorks newsletter
US 원문 읽기
Also in the Java zone:
Tutorials
Tools and products
Code and components
Articles
필자소개
Photo of authorA. O. Van Emmenis는 독립 컨설턴트로서 영국 캠브리지에서 Java/J2EE 트레이닝 및 컨설팅을 담당하고 있다.
이 기사에 대하여 어떻게 생각하십니까?

정말 좋다 (5) 좋다 (4) 그저그렇다 (3) 수정보완이 필요하다(2) 형편없다 (1)

  회사소개  |  개인정보 보호정책  |  법률  |  문의