소개

2005년 8월에 출시된 이후 솔라리스는 커다란 반향을 불러일으켜 왔습니다. 600만건 이상의 등록된 다운로드 건수를 기록해 온 솔라리스는 데스크탑 개발자들이 그들의 어플리케이션을 개발하고 배치하는 타겟중에 하나로 고려 되고 있습니다. 이러한 성공은 솔라리스에 포함된 기능인 존, Dtrace, 자가예측 기능, 및 ZFS 같은 최신의 기술적인 혁신외에 솔라리스의 오픈소소화가 밑바탕이 되고 있습니다.

개발자들은 어떠한 데스크탑에 어플리케이션을 배치 할까요? 아마 솔라리스10 에서 오래동안 사용되던 CDE를 대체한 새로운 데스크탑인 GNOME에 배치할 것입니다. GNOME 은 현대적인 데스크탑으로써 개발자들의 그들의 best-of-breed 데스크탑 어플리케이션을 보여줄 수 있도록 도와줄 것입니다.

GNOME 커뮤니티는 데스크탑 개발자들을 끌어들이기 위해 C 외의 다른 개발 수단을 제공할 수 있어야 함에 대해 전체적으로 공감하고 있습니다. C는 상대적으로 저수준이고 너츠-와-볼트 형태의 언어로써 현대의 객체지향 언어가 제공하고 있는 인터페이스 기반의 프로그래밍, 자동화된 메모리 관리, 예외 처리 같은 생산성과 관련된 기능들을 포함하고 있지 않습니다. 여러분이 살펴보게될 프로그래밍 언어는 현대에서 사용되고 있는 언어중 가장 성공적인 객체지향 언어인 자바 프로그래밍 언어로 GPL 라이센스 하에 오프소스화됐고 인기도가 계속해서 상승하고 있습니다. 또한 앞에서 언급한 언어적인 측면 외에도 자바 프로그래밍 언어는, 특히 자바 개발 키트(JDK)는 방대한 양의 견고한 자바 플랫폼 API를 제공함으로써 개발자들이 현대 어플리케이션들이 다루어야 할 다양한 데이타 스트림, XML 데이타 소스 파싱, 네트워크 작업 같은 UI와 관련없는 작업들의 개발들도 매우 쉽게 할 수 있도록 도와 줍니다.

95 퍼센트 이상의 GNOME 데스크탑 이 C로 쓰여 졌고 많은 사람들이 현대적인 스타일의 썬 스튜디오나 NetBeans 같은 IDE들의 C/C++ 모듈을 이용해 계속해서 데스크탑 어플리케이션을 C로 개발 할 것입니다., 그러나 이 글은 이러한 청중들을 위한 글은 아닙니다. GNOME 의 C 기반 개발에 관한 방대한 양의 온라인 문서가 gnome.org 에서 제공됩니다.

이 글은 자바 GNOME 데스크탑 어플리케이션을 개발하려는 자바 개발자들을 위한 선택에 대해 간략히 소개한 후에 자바 GNOME 바인딩이라고 하는 특정 기술에 촛점을 맞출 것입니다. 이러한 바인딩은 GNMOE 플랫폼에 친숙한 개발자들에게 촛점을 맞추고 있지만 C 기반의 어플리케이션 개발을 완전히 자바로 대체하려는 개발자들에게는 적당하지 않을 수도 있습니다. 바인딩은 솔라리스 익스프레스 개발자 에디션 2/07 의 일부로써 제공됩니다.

선택

자바 개발자들이 솔라리스의 데스크탑 어플리케이션을 개발하려고 할때에는 기존의 GNOME 데스크탑과 잘 통합 될수 있는 어플리케이션을 만들어야 합니다. 이러한 어플리케이션은 데스크탑 테마와 동일한 네이티브 룩앤 필을 공유해서 네이티브 시스템 다이얼로그, 네이티브 설정 엔진, 그리고 네이티브 GNMOE 데스크탑 어플리케이션과 비슷하게 동일하도록 해야 합니다.

개발자들에게는 많은 선택들이 존재 합니다. 자바 플랫폼의 스탠다드 에디션(Java SE) 에서 제공하는 스윙 어플리케이션 프레임워크, 혹은 이클립스에서 제공하는 SWT 프레임워크를 사용할 수 있습니다. 그러나 이미 GNOME 개발자이고 Glade/GTK 기반 개발에 친숙하다 하더라도 또다른 프레임워크를 배워야 하므로 이러한 것이 시간낭비가 될 수 있습니다. 자바 GNOME 바인딩은 또 다른 선택을 제공 합니다. 이것은 GNOME 플랫폼 라이브러리와 freedesktop.org 의 Cairo 2D 드로잉 엔진을 위한 자바 바인딩 셋입니다. 바인딩은 GNOME 과 GTK+ 어플리케이션이 자바 언어로 쓰여질 수 있도록 하고 자바 네이티브 인터페이스(JNI) 를 이용해서 자바 와 기반 GNOME 플랫폼, 그리고 Cairo C 라이브러리가 서로 연결 될 수 있도록 지원 합니다.

강조되어야 할 점은 자바 GNOME 바인딩을 이용하는 것은 스윙이 제공하는 자바 UI 프레임워크나 "write once run anywhere" 같은 자바의 유연함을 포기해야 하는 것을 의미 합니다. 왜냐하면 이러한 기반 GNOME 플랫폼 과 Cairo 라이브러리와의 강결합 때문입니다. 그러나 만약 충실한 그리고 네이비트한 GNOME 통합이 중요한 목적이라면 이것은 적절한 교환조건이 될 수 있습니다. 자바 GNOME 바인딩은 간단히 데스크탑 어플리케이션의 개발에 또 다른 선택권을 줍니다. 데스크탑 어플리케이션을 위한 적절한 프레임워크를 선택할때 플랫폼 API/프레임워크에 대한 지식, 크로스 플랫폼 과 네이티브 통합 요건 중에 어떠한 측면에 우위를 둘것인지는 개발자들에게 달려 있습니다.

이 글의 나머지 부분은 자바 기술-기반의 GNOME 어플리케이션을 개발하는데 이용되는 자바 GNOME 바인딩에 대해 다룹니다. 예제들은 NetBeans IDE 로 개발 되었지만 이클립스(추천 도서 의 자바 GNOME 데모 리스트 참고) 혹은 IntelliJ, jEdit, Emacs 혹은 vi 같은 IDE를 이용해서 개발 할 수도 있습니다.

자바 GNOME 바인딩이란?

앞부분에서 언급했지만 이것은 GNOME 과 GTK+ 어플리케이션을 개발할때 필요로한 코어 라이브러리들을 위한 바인딩 셋입니다. 바인딩은 자바 API를 제공해서 Java SE 플랫폼에서 지원하는 JNI 를 통해서 기반 플랫폼의 C API 에 접근이 가능하도록 합니다. 바인딩은 솔라리스 패키지의 셋으로 제공 됩니다. :

  • API jars 는 자바 API를 제공하고 자바 GNOME API 를 어플리케이션에서 import 할 수 있도록 함
  • API 라이브러리는 JNI 네이티브 C 라이브러리들을 지원함으로써 자바 API 로 호출이 가능하도록 함
  • API 소스 jars 에 대한 문서는 IDE에서 코드 자동 완성 및 소스 코드 브라우징에 사용이 가능함
  • API Javadoc 은 API의 포괄적인 문서를 제공함
어떻게 얻을 수 있습니까?

좋은 소식으로는 이러한 바인딩의 솔라리스 익스프레스, 개발자 에디션 2/07 부터 포함되었다는 것입닏.ㅏ 솔라리스에 기본으로 설치된 자바 GNOME 패키지는 SUNWgnome-base-libs-java, SUNWgnome-libs-java, SUNWgnome-config-java, 그리고 SUNWgnome-terminal-java 입니다.

Java GNOME 과 NetBeans IDE

NetBeans 는 강력한 자바기반의 IDE로 netbeans.org 에서 다운로드 가능합니다. 자바 GNOME 과 NetBeans IDE는 자바 GNOME 데스크탑 어플리케이션을 사용하는데 같이 이용될 수 있고 IDE를 자바 GNOME API 와 같이 이용해서 앞부부넹서 언급했듯이 여러가지의 샘플 프로그램들을 빌드할 수 있습니다.

NetBeans IDE의 자바 GNOME 라이브러리

어플리케이션에 바인딩에 접근하기 위해서 여러분은 자바 GNOME 라이브러리를 생성하고 추가해서 NetBeans IDE가 모든 자바 GNOME API jars, 소스 jars, Javadoc 을 참고할 수 있도록 해야 합니다. 이 작업이 완료된 후에는 단순히 해당 라이브러리를 새로운 프로젝트에 추가시킴으로써 어플리케이션에게 바인딩에 접근 할 수 있는 권한을 부여할 수 있습니다.

Netbeans IDE 에서 자바 GNOME 라이브러리 설정

다음의 단계를 통해서 JavaGnomeLib 를 여러분들이 사용하는 프로젝트에 수동으로 설정합니다.

  • 라이브러리 생성
    • 최상위 레벨 NetBeans 메뉴를 선택:
      • Tools/Library Manager
    • New Library 를 클릭하여 새로운 라이브러리를 생성하고 JavaGnomeLib 라고 명명
  • jar 파일들 추가
    • Classpath 탭에서 Add Jar/Folder 를 클릭하고 /usr/share/lib/java 에서 java-gnome 이 설치한 jar 파일들을 선택
    • 다음과 같은 jar 파일들을 선택하고 라이브러리에 추가: cairo1.0.jar, gconf2.12.jar, glade2.12.jar, glib0.4.jar, gnome2.12.jar, gtk2.10.jar, vte0.12.jar
  • 소스 jar 파일들을 추가
    • Sources Tab 을 클릭하고 Add Jar/Folder 을 클릭해서 /usr/share/lib/java/src/java-gnome 에서 java-gnome 이 설치한 소스 jars 파일들을 선택
    • 다음과 같은 jar 파일들을 선택하고 라이브러리에 추가: cairo1.0-src.jar, gconf2.12-src.jar, glade2.12-src.jar, glib0.4-src.jar, gnome2.12-src.jar, gtk2.10-src.jar, vte0.12-src.jar
  • javadoc 을 추가
    • Javadoc Tab 을 클릭하고 Add Zip/Folder 을 클릭해서 /usr/share/lib/java/javadoc/java-gnome 에서 java-gnome 이 설치한 javadoc 을 선택under /usr/share/lib/java/javadoc/java-gnome
    • 다음과 같은 폴더들을 선택하고 라이브러리에 추가: cairo-java-1.0.6, libgconf-java-2.12.5, libgnome-java-2.12.6, libvte-java-0.12.2, glib-java-0.4.0, libglade-java-2.12.7, libgtk-java-2.10.0

설정을 간단히 하기 위해 우리는 자바 GNOME NetBeans 플러그인을 만들고 있고 OpenSolaris.org 자바 데스크탑 시스템 프로젝트페이지의 다운로드 공간에서 곧 다운로드가 가능할 예정입니다(참고자료 섹션 참고). 플러그인을 설치 하면 JavaGnomeLib 를 자동으로 생성할 것입니다. 참고사항으로 여러분의 어플리케이션이 모든 자바 GNOME API jar 들을 필요로 하지 않을 수도 있지만 하나의 JavaGnomeLibrary 을 여러분의 자바 GNOME 기반 프로젝트에 추가하는 것이 절차를 단순화 할 수 있습니다.

자바 GNOME "Hello World" 생성하기

NetBeans IDE 를 실행시키고 표준 자바 어플리케이션을 생성합니다.

  • File/ New Project-> General -> Java Application

어플리케이션을 "hello" 라고 명명하고 JavaGnomeLib 를 사용하도록 설정합니다.

  • File/"hello" Properties -> Libraries 카테고리로 이동함. Compile 과 Run Tabs 에서 Add Library 를 클릭하고 JavaGnomeLib 을 선택함.

이제 코딩할 준비가 되었습니다. 간단한 "Hello World" 로 시작해 보겠습니다.

 
Figure 1:
그림 1: NetBeans IDE 5.5 상의 "Hello World" 자바 코드

첫번째로 GTK+ 바인딩에서 사용하길 원하는 다양한 API 들을 불러 옵니다. (참고자료 섹션에 목록화된 자바 GNOME 멘 페이지를 참고해서 전체 API import 목록을 확인 하시기 바람.) 만약 API 소스를 보고자 한다면 import 구문에서 오른쪽 클릭을 한 다음 Go To -> Source 를 선택합니다. jar 파일에서 모든 소스 파일들이 프로젝트 패널에 나타남으로써 어떠한 API를 사용할지 확신하지 못할때 매우 유용할 수 있습니다. NetBeans IDE 는 또한 코드 자동완성 기능을 지원하므로 단순히 window. 을 입력하면 윈도우 위젯과 관련된 모든 사용가능한 API와 API Javadoc 을 보여줄 것입니다.

Hello 의 생성자에서 최상위 레벨 윈도우를 생성하고 "Hello!" 타이틀을 가진 버튼을 추가시키고, 사이즈를 설정한 다음 보여 줍니다. 메인 루틴은 GTK를 초기화 시키고, Hello 의 생성자를 호출 하고, 그 다음 GTK의 메인 이벤트 루프를 실행 시켜서 사용자의 입력을 처리해서 어플리케이션에 반영합니다.

간결하게 설명하기 위해 필자는 LifeCycleListener 핸드러를 윈도우에 추가시켜서 유저가 닫기 "X" 를 눌렀을때 어플리케이션을 깨끗하게 종료시키는 법에 대해 보여 주지 않았습니다. 어떻게 하는 지 살펴 보려면 HelloWorld.java in 샘플 코드 목록의 java-gnome-code.tar 파일 에서 HelloWorld.java 를 참고하시기 바랍니다.

흥미롭지는 않았지만 여러분은 방금 막 자바 프로그래밍으로 만들어진 네이티브 GTK 어플리케이션을 생성했습니다. 이 어플리케이션은 여러분이 어떠한 데스크탑 테마를 사용하더라도 적절하게 대응할 것입니다. 직접 테스트를 통해 필자가 말하려는 의도를 알아보시기 바랍니다. GNOME에서 Start Menu -> Preferences-> Theme 를 통해서 테마를 Nimbus 에서 Blueprint 로 전환합니다.

 
Figure 2a: Hello World Displayed in the Nimbus Theme in GNOME
그림 2a: GNMOE의 Nimbus 테마에서의 "Hello World"
 
Figure 2a: Hello World Displayed in the Nimbus Theme in GNOME
그림 2b: GNOME의 Blueprint 테마에서의 "Hello World"
유저에 반응하기

버튼을 클릭하면 아무런 반응도 나타나지 않습니다. 그러므로 다른 자바 어플리케이션 프레임워크에서 했던것과 마찬가지로 액션 핸들러를 추가합니다. 이것은 org.gnu.gtk.event.ButtonListener 입니다.

다음의 버튼 리스너를 Hello 생성자에 btn 을 생성한 다음에 추가시킵니다.

btn.addListener(new ButtonListener() {
	public void buttonEvent(ButtonEvent e) {
	 	if (e.isOfType(ButtonEvent.Type.CLICK))
	   { System.out.println("Hello cruel world!"); } } });

만약 코드에 어떠한 문제가 있다면 NetBeans IDE 는 여러분이 입력한 코드의 왼쪽 사이드에 작은 전구를 보여주고 이를 통해서 문제점에 대한 제안을 해 줍니다. 이러한 코드 힌트들은 컨트롤-스페이스 키를 통해서도 나타나게 할 수 있습니다. 앞의 코드를 입력하면 전구 표시가 나타날 것입니다. 전구 를 클릭하면 ButtonListenerButtonEvent 그리고 ButtonEvent.Type 을 import 하도록 권할 것입니다.

 
Figure 3: Code Hints in the NetBeans IDE
그림 3: NetBeans IDE 의 코드 힌트

어플리케이션을 실행한 다음 Hello World 버튼을 클릭하면 표준 출력에 "Hello cruel world!" 메세지를 생성할 것입니다.

 
Figure 4:
그림 4: "Hello World"가 버튼 클릭에 응답하는 모습
Glade 와 혼합해서 사용하기

여러분은 이전에 했던 대로 UI 작업을 계속해서 해나갈 수 있습니다. 그러나 복잡한 실세계의 데스크탑 어플리케이션을 다룰때 이런 방식은 매우 진저리 나는 작업이 될 수 있습니다. UI 와 코드를 분리 할 수 있도록 하는게 더 낳지 않을까요? 이것이 바로 Glade 가 하는일 입니다. 이것은 GNOME UI 디자이너로 여러분이 UI를 WYSIWYG 방식의 에디터로 생성할 수 있고 이것을 UI XML 정의 파일로 저장할 수 있도록 해 줍니다. 이 Glade 파일은 LibGlade API 를 지원하는 모든 GNOME 어플리케이션에서 로딩이 가능하고 또한 GNOME 바인딩의 일부로도 지원 됩니다.

이제 여러분은 Glade 에서 여러분의 Hello World 어플리케이션 보다 좀 더 복잡한 UI 생성해서 테스트 어플리케이션에서 로딩할 수 있습니다. 필자는 Andrew Overholt 의 플래시 데모를 참조 했습니다. 그에게 감사드립니다 (추천 도서).

Glade 를 실행시킵니다

  • All Applications -> Developer Tools -> Glade User Interface Designer

메인 Glade 윈도우가 Palette, Widget Tree, 그리고Properties 패널과 함께 나타납니다.

 
Figure 5: Glade User Interface Designer
그림 5: Glade 유저 인터페이스 디자이너
  • New 를 클릭해서 새로운 프로젝트를 생성하고 GTK+ 프로젝트를 선택합니다.

이제 Palette "GTK+ Basic" 섹션에서 Window 를 선택합니다. 3줄의 Vertical Box 를 윈도우에 추가 시킵니다 (단순히 팔렛트 아이템에 마우스를 올려 놓으면 그 아이템의 이름을 알 수 있습니다). 그 다음 제일 윗줄에 Label 을 추가시키고 가운데 줄에 Button 을 추가시키고 마지막으로 제일 아래줄에는 Text 엔트리 위젯을 추가 시킵니다.

생성된 위젯들의 속성을 변경하려면 단순히 위젯트리에서 해당 위젯을 선택하거나 현 윈도우에서 선택해서 프로퍼티 패널을 통해서 수정합니다.

  • window1 의 타이틀을 TestGlade 변경함. label1 의 레이블을 "Label's are cool," 로 변경하고 button1 의 레이블을 "Press Me!" 로 변경함. 그 다음 메인 윈도우를 리사이징 시켜서 그림 6과 비슷한 UI를 가지도록 함.
  • TestGlade 라는 새로운 NetBeans 자바 어플리케이션 프로젝트를 생성하고 이전과 마찬가지로 JavaGnomeLib 을 사용하도록 함. 그 다음 Glade 메인 윈도울 돌아가서 Glade 프로젝트를 NetBeans의 TestGlade 프로젝트 디렉토리 아래에 새로운 glade 라는 이름의 디렉토리에 저장하고 프로젝트 이름을 "TestGlade" 라고 설정함. 이것은 glade/testglade.glade 아래에 UI 정의를 저장하게 됨.
 
Figure 6: TestGlade UI Created in the Glade UI Designer
Figure 6: TestGlade UI Created in the Glade UI Designer
Glade UI 와 어플리케이션의 연결

여러분의 GNOME 어플리케이션이 새로운 Glade UI 를 사용하기 위해서는 Glade 파일을 여러분의 어플리케이션 생성자에서 로딩시켜야 합니다.

public TestGlade() {
    LibGlade glade = new LibGlade("glade/testglade.glade", this);
  }

NetBeans IDE 는 LibGlade 를 import 하도록 지시할 것이고 이 호출에 try 블럭을 추가하도록 할 것입니다. 만약 Glade 파일이 없거나 XML 이 잘못된 파일일때 예외를 던질것이기 때문입니다. 완전한 코드 소스는 샘플 코드 리스팅 에 있는 java-gnome-code.tar 파일안에 TestGlade.java 를 참고 바랍니다.

이러한 방법은 UI를 생성하는 가장 간단한 방법이지만 현 단계에서는 아무런 작업도 하지 않습니다. 여러분이 해야할 작업은 유저 이벤트를 어플리케이션 코드에 전달함으로써 그에 맞게 동작하도록 해야 합니다. Glade 시그널 핸들러가 필요한 도구를 제공합니다.

시그널 핸들러 -- Glade의 액션 핸들러

Glade 에서 만약 여러분이 사용자 반응에 동작하는 자바 코드를 작성하고자 한다면 여러분은 Glade 내의 위젯에 시그널 핸들러를 서로 연관시키고 시그널 핸들러 구현을 여러분의 코드에서 제공할 수 있습니다. 이것은 첫번째 예제에서의 액션 핸들러를 설정하는 것과 매우 유사한 작업입니다. 여러분은 Glade 의 주어진 어떠한 위젯에도 다양한 범위의 시그널 핸들러를 연관시킬 수 있습니다. 이러한 시그널 핸들러는 그 다음 어플리케이션 코드에서 구현 되어져서 어플리케이션 수행시에 일어나는 적절한 사용자의 반응에 대라 실행되게 됩니다.

반드시 강조되어야할 얘기로 시그널 핸들러와 자바 구현체는 반드시 정확하게 동일한 이름을 가지고 있어야 합니다. 여러분은 자바 메소드 구현체가 동일한 이름을 가지고 있다는 것만 만족한다면 Glade 의 기본 이름을 사용하거나 Glade 내에서 그것을 생성 혹은 수정 할 수 있습니다.

TestGlade 어플리케이션을 확장해서 "Press Me!" 버튼을 클릭하면 "Button Clicked!" 라는 메세지를 표준 출력 윈도우에 생성하도록 합니다.

일단 Glade 의 Test Glade 프로젝트로 돌아 갑니다.

  • button1 을 클릭하고 Properties 다이얼로그 에서 Signals 탭을 선택. Signal selection "..." 버튼을 클릭하고 "clicked" 시그널을 선택. Add 를 클릭해서 시그널 핸들러를 추가.

이것은 on_button1_clicked 핸들러를 생성합니다. Glade 프로젝트를 저장합니다.

아래는 Glade 의 스크린 샷으로 button1 시그널 핸들러 on_button1_clicked 를 Properties 다이얼로그의 Signals 탭에서 설정한 화면 입니다.

 
Figure 7: Adding a Signal Handler in the Glade UI Designer
그림 7: Glade UI 디자이너에서 시그널 핸들러를 추가시키기

NetBeans TestGlade 프로젝트로 돌아 갑니다.

  • "Press Me!" 를 클릭했을때 처리를 담달한 시그널 핸들러에 대한 구현을 추가.
public void on_button1_clicked() {
    System.out.println("Button Clicked!");
  }

TestGlade 어플리케이션을 실행시키고 "Press Me!" 버튼을 클릭해서 시그널핸들러의 동작을 확인 합니다.

위젯에 접근하기

어플리케이션이 시그널 핸들러에서 사용자의 동작에 반응할때 여러분은 하나 혹은 그 이상의 위젯에 접근해서 어플리케이션을 특정한 방식으로 수정해야 될 필요가 있을 것입니다. 예를 들어 "Press Me!" 를 클릭했을때 공정된 메세지가 나타나는 것이 아니라 어플리케이션이 Text 엔트리 위젯에 사용자가 입력한 텍스트를 표준 출력으로 출력하기를 원할 수 있습니다.

이러한 작업을 위해서는 Glade 위젯의 핸들을 얻어와서 이것을 on_button1_clicked 시그널 핸들러에 의해 참조되는 클래스에 내부적으로 저장해야 합니다. 실제 코드 생성 단계에서 만약 getWidget() 호출이 어떠한 예외도 던지지 않았다면 getWidget() 호출 후에 "entry" 가 존재하는지 확인할 것입니다.

LibGlade glade = new LibGlade("glade/testglade.glade", this);
entry = (Entry)glade.getWidget("entry1");

이전의 코드를 입력했다면 NetBeans IDE 는 "Create field entry in testglade.TestGlade" 라는 메세지를 통해서 "private Entry entry;" 인스턴스 변수를 추가하도록 요구할 것입니다. 이제 시그널 핸들러를 수정해서 Text Entry 위젯의 텍스트에 접근하도록 합니다.

public void on_button1_clicked() {
    System.out.println("User typed: " + entry.getText());
  }

좀 더 복잡한 예제 - Calculator 예제

좀 더 흥미로운 어플리케이션의 예제를 위해 필자는 NetBeans BlueJ Calculator 예제를 가져왔습니다 (David J. Barnes 와 Michael Kolling 에 의해 만들어짐) 그리고 이것을 Glade UI 와 자바 GNOME API 를 사용하도록 포팅 하였습니다. 코어 계산기 CalcEngine 은 변경하지 않았스빈다. 코드의 전체 목록은 이 글의 마지막에 예제 코드 목록을 참고 하시기 바랍니다.

 
Figure 8: Java GNOME Calculator Example
그림 8: 자바 GNOME Calculator 예제

엔진이 오직 더하기와 빼기만을 지원하기 때문에, 필자는 GNOME Calculator 의 UI를 Glade 를 이용해 솔라리스에서 디자인 하면서 지원되지 않는 버튼들에 Sensitivity 를 "No"라고 지정하였습니다(Properties Panel -> Common Tab).

여러분이 코드를 살펴 보았다면 몇가지를 살펴볼 가치가 있습니다.

GNOME 어플리케이션 -- 이것은 GNOME 어플리케이션으로 GTK+ 어플리케이션과는 정반대 입니다. 즉 Glade 에서 GNOME 어플리케이션을 생성할때 여러분은 일반적인 윈도우를 시작 포인트로 사용하는 것과는 반대로 팔렛트 "GNOME" 섹션에서 어플리케이션 윈도우를 생성할 수 있습니다. 어플리케이션 윈도우는 최상의 레벨 메뉴, 툴바, 사용자가 원하는대로 수정할 수 있는 app 바(상태 메세지)를 가지고 있습니다.

이전에 논의 했었던 Program.initGnomeUI 를 이용해서 GTK 어플리케이션을 초기화 시켰던 방법과는 약간 다르게 초기화 됩니다:

public static void main(String[] args) {

    Program prog = Program.initGnomeUI("Calculator", "1.0", args);

    new CalculatorApp();

    Gtk.main();

  }

명명된 오브젝트를 시그널 핸들러에 전달하기 -- 종종 여러분은 주어진 오브젝트를 시그널 핸들러와 연관시켜서 시그널 핸들러가 UI에 의해 트리거 됐을때 이것을 전달하는 것이 필요할 수 있습니다. 계산기 예제를 예를 들어 각 함수 버튼마다 각각의 시그널 핸들러를 가지는 것 대신에 하나의 시그널 핸들러를 두고 유저가 버튼을 누르는 것에 따라 입력값을 처리하는 것을 원할 수 있습니다. Glade 에서 이러한 작업을 수행하는 방법은 버튼의 시그널 핸들러를 설정할 때 버튼의 이름에 Object 필드를 버튼의 이름으로 설정하는 것입니다. 이 방법을 통해서 명명된 버튼은 시그널 핸들러로 전달되게 됩니다. 이 오브젝트를 처리하는 것은 단순히 오버로딩된 시그널 핸들러를 자바 코드안에서 사용함으로써 적절한 Event 위젯과 범용 타겟 Object 를 취하는 것입니다. 이때 적절한 캐스팅 작업이 반드시 필요 합니다.

public void on_button_clicked(ButtonEvent event, Object target) {
    // Get the Named Button Widget set as the Signal Handler 
//Object in Glade String command = ((Button) target).getLabel(); System.out.println("Button Clicked: " + command); if( command.equals("0") || command.equals("1") || command.equals("2") || command.equals("3") || :

GConf -- 이것은 GNOME 의 설정 시스템으로 유저 어플리케이션의 설정과 데이타를 저장하기 위해 반드시 사용되어야 합니다. 추가적으로 이 프로그램은 어플리케이션이 사용해야할 GNOME 의 시스템 전반적인 데이타 (예를 들어 네트워크 클라이언트를 위한 프록시 셋팅) 를 가져 오는데 사용 될 수 있습니다. GConf 의 사용 예를 위해서 UserInterface.java 에 여러가지 함수들이 추가되어졌습니다. 첫째로 GConf 를 초기화 하기 위해서 그리고 둘째로 calculator 에 입력된 마지막 숫자를 get/set 하기 위해서 입니다. 이 데이타는 사용자가 File-> Quit 를 사용해서 어플리케이션을 닫을때 GConf 시스템에서 calculator를 실행하는 사이에 저장되어 집니다. GConf 의 사용은 단순히 GConf 시스템의 핸들을 얻는 것만을 요구 합니다. 그다음에는 ConfClient 에는 상호 작용할 디렉토리를 지정함으로써 추후에 이 클라이언트 인스턴스를 이용해서 GConf 의 키 값들을 생성하고 가져오고 저장할 수 있습니다.

private final String lastResultKey = 
        "/apps/javagnome_calculator_app/last_result";
		:
public void setupGconfAccess() {
  client = ConfClient.getInstance();
  try {

    client.addDirectory("/apps/javagnome-calculator-app", 
        ConfClientPreloadType.NONE);
     
     :
 public String getGconfKeyValue(String configKey){
   try {
      return client.getString(configKey);
      :

 public void setGconfKeyValue
(String configKey, String configKeyValue){
try { if (null != configKeyValue) client.setString(configKey, configKeyValue); :

여러분은 또한 ConfClientListenerConfClient 인스턴스에 지정해서 특정 GConf 키 값의 변경에 대한 통지를 얻을 수도 있고, 원한다면 client.addListener (listener, configKey) 를 사용할 수도 있습니다.

더 깊이 들어가기

해야할 일이 아직 많이 남아 있습니다. 자바 GNOME 바인딩에 같이 제공되는 예제들을 살펴 보시기 바랍니다. 특히 다음의 TestGtk 와 TestGnome 어플리케이션을 참고하시기 바랍니다:

/usr/share/lib/java/javadoc/java-gnome/
libgtk-java-##/examples/testgtk/TestGTK /usr/share/lib/java/javadoc/java-gnome/
libgnome-java-##/examples/testgnome/TestGNOME

GConf 와 Glade 예제들은 또한 이전에 언급했던 javadoc/java-gnome 디렉토리의 libgcon,libglade 서브디렉토리들 상에서 발견할 수 있습니다. 실세계의 어플리케이션은 자바 GNOME 커뮤니티 사이트를 참고하시기 바랍니다. (추천 도서 섹션의 "Java GNOME application" 참고). #java-gnome 채널 (irc.gimp.net) 에 들려서 개발자들과 채팅을 하거나 바인딩에 궁금한 질문을 해주셔도 됩니다. 만약 여러분의 멋진 어플리케이션을 알려주고 싶다면 그들이 여러분을 도와줄 것입니다!

결론

자바 GNOME 바인딩은 Glade-기반 GNOME/GTK+ 어플리케이션 개발에 익숙한 개발자들에게 이러한 정류의 데스크탑 어플리케이션을 자바 환경에서 개발할 수 있는 실용적인 방법을 제공 합니다. 현재 코어 라이브러리의 대부분을 사용할 수 있지만 GNOME 애플릿 지원이나 시스템 트레이 지원 같은 몇가지 부분이 빠져 있습니다.

자바 GNOME 커뮤니티는 이미 바인딩의 재디자인을 통해 좀더 자동화된 바인딩 생성을 지원하도록 노력하고 있습니다. 이 작업은 GNOME 플랫폼과 Cairo 네이티브 라이브러리의 API를 거의 100% 사용할 수 있도록 할 것이고 앞으로의 GNOME 플랫폼 배포판과 동기화 되도록 할 것입니다.

커뮤니티 사이트를 통해서 최신 업데이트를 항상 확인하시기 바랍니다. 커뮤니티는 언제나 프로젝트의 새로운 공헌자를 환영합니다. 자 이제 자바 GNOME 을 해킹해 봅시다!

저자에 관하여

John Rice 는 썬의 staff engineer 로 지난 수년간 오픈솔라리스 데스크탑 그룹에서 일해 왔습니다. 이 전에 그는 오픈오피스 팀에서 일했었고 마이크로소프트 오피스의 매크로를 오픈오피스로 자동 마이그레이션 하는 작업을 해왔습니다. 그는 소프트웨어 분야에서 18년의 개발 경력을 가지고 있고 대부분은 문서 관리과 데스크탑 어플리케이션 개발입니다. GNOME Advisory Board 의 멤버로 John 은 아일랜드의 동쪽 해변에 살고 있습니다.

추천 도서
관련 자료

Solaris Express, Developer Edition 2/07 - Java GNOME 2.16 installation:

  • Installed packages:
    • SUNWgnome-base-libs-java
    • SUNWgnome-libs-java
    • SUNWgnome-config-java
    • SUNWgnome-terminal-java
  • API jars (/usr/share/lib/java/):
    • cairo1.0.jar
    • glib0.4.jar
    • gtk2.10.jar
    • gnome2.12.jar
    • glade2.12.jar
    • gconf2.12.jar
    • vte0.12.jar
  • API libraries (/usr/lib/):
    • libcairojni.so
    • libglibjni.so
    • libgtkjni.so
    • libgnomejni.so
    • libgladejni.so
    • libgconfjni.so
    • libvtejni.so
  • API Javadoc: /usr/share/lib/java/javadoc/java-gnome/*/index.html
  • API source jars: /usr/share/lib/java/src/java-gnome/*-src.jar
  • API examples: /usr/share/lib/java/javadoc/java-gnome/*/examples/
  • Man page (3): man java-gnome
  • NetBeans IDE 5.5 download
  • OpenSolaris.org Java Desktop System Project
예제 코드 목록

예제 코드 목록은 java-gnome-code.tar 파일에서 사용이 가능합니다. tar 파일의 내용은 아래와 같습니다:

java-gnome-code/
java-gnome-code/testglade/
java-gnome-code/testglade/TestGlade.java
java-gnome-code/testglade/glade/
java-gnome-code/testglade/glade/testglade.glade.txt
java-gnome-code/licensing.txt
java-gnome-code/hello/
java-gnome-code/hello/Hello.java
java-gnome-code/calculator/
java-gnome-code/calculator/UserInterface.java
java-gnome-code/calculator/CalcEngine.java
java-gnome-code/calculator/CalculatorApp.java
java-gnome-code/calculator/glade/
java-gnome-code/calculator/glade/calculator.glade.txt

주의: glade.txt 로 끝나는 파일들은 .glade 파일로 사용 전에 재명명 되어야 합니다.

"개발자코너" 카테고리의 다른 글

2007/04/20 18:09 2007/04/20 18:09

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/370

댓글을 달아 주세요

  1. 고진구  수정/삭제  댓글쓰기

    짬짬이 좋은 공부 하고 갑니다. 좋은 자료 많이 많이 올려주세요.

    2007/09/12 22:02
  2. 김문경  수정/삭제  댓글쓰기

    모르는 단어가 많아서..좀 더 열심히 공부 해야지 겠읍니다^^

    2007/09/18 14:35
  3. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 03:46
[로그인][오픈아이디란?]

◀ Prev 1  ... 452 453 454 455 456 457 458 459 460  ... 806  Next ▶