JDesktop 통합 컴포넌트(JDIC) (https://jdic.dev.java.net)는 자바 애플리케이션이 native desktop에 통합할 수 있게 하며, 이 애플리케이션들이 웹브라우저나 이메일툴과 같은 운영시스템 지정 프로그램에서 제공되는 기능의 이점을 사용할 수 있게 한다. JDIC는 현재 솔라리스 8버전 이상, JDS(the Sun Java Desktop System) 1버전 이상, 다양한 윈도우(ME, NT, XP, 2003, and 2000), SuSE 리눅스 7 버전 이상 그리고 레드햇 리눅스 8버전 이상에서 지원된다. 또 이후 버전에서는 Mac OS X에서도 지원될 예정이다.

이번 테크팁에서는 JEditorPane을 이용해서 웹페이지를 로딩해보고, 이 방법의 몇가지 제한사항에 대해서 생각해보자. JDIC의 두 가지 다른 기능을 사용하여 사용자의 웹 브라우저에서 웹페이지(JFrame의 일부로써)를 보도록 한다.

많은 Swing 컴포넌트로 HTML을 나타낼 수 있다. 예를 들어, 다음과 같이 JEditorPane을 사용할 수 있다.

   private void loadStartingPage() {
     JEditorPane editor = new JEditorPane();
     editor.setEditable(false);
     try {
       editor.setPage("http://www.java.net/");
     } catch (IOException e) {
       System.err.println("can't connect");
     }
   }

URL이 접근가능하다면, 결과 페이지가 JEditorPane상에서 보여지게 될 것이다. 물론, JScrollPane이 포함된 JFrame이 제공되어하며, JScrollPane에는 JEditorPane이 포함되어야 하며, 쓰레드 안정성을 위해, 또한 event-dispatching thread 상의 업무를 스케줄링하여 GUI를 생성해야한다. 다음의 클래스에서 이를 보여주고 있다.

   import javax.swing.JScrollPane;
   import javax.swing.JEditorPane;
   import javax.swing.JFrame;
   import javax.swing.SwingUtilities;
   import java.io.IOException;
   import java.awt.Dimension;

   public class EditorPaneHTMLViewer extends JEditorPane {
     private JScrollPane createScrollPane() {
       JScrollPane editorScrollPane = new JScrollPane(this);
       editorScrollPane.setPreferredSize(
               new Dimension(700, 500));
       return editorScrollPane;
     }

     private void loadStartingPage() {
       setEditable(false);
       try {
         setPage("http://www.java.net/");
       } catch (IOException e) {
         System.err.println("can't connect/");
       }
     }

     private void createAndShowGUI() {
       JFrame frame = new JFrame("EditorPaneHTMLViewer/");
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       JScrollPane content = createScrollPane();
       loadStartingPage();
       frame.add(content);
       frame.pack();
       frame.setVisible(true);
     }

     public static void main(String[] args) {
       //Schedule a job for the event-dispatching thread:
       SwingUtilities.invokeLater(new Runnable() {
         public void run() {
           (new EditorPaneHTMLViewer()).createAndShowGUI();
         }
       });
     }
   }

좋은 소식은 이 프로그램을 컴파일하고 구동하면 결과 HTML이 JEditorPane에 보여진다는 것이다. 그러나 현재의 HTML 지원기능에서 완전히 나타내지 못하는 최신 표준 페이지들이 많다는 것 또한 알 수 있을 것이다.

HTML Viewer

그러나 완벽한 웹브라우저가 설치된다하더라도 JEditorPane과 같은 Swing 컴포넌트의 웹 페이지들을 완전하게 볼 수는 없으며, 이를 해결해주는 것이 JDIC이다. JDIC 패키지 중 하나인 org.jdesktop.jdic.desktop.Desktop에 있는 browse() 메소드를 호출하여 사용자의 기본 웹브라우저의 특정 페이지를 연다. browse() 메소드를 호출할 때는 다음의 예제에서와 같이 java.net.URL 오브젝트를 전달해야한다.

   import org.jdesktop.jdic.desktop.Desktop;
   import org.jdesktop.jdic.desktop.DesktopException;
   import java.net.URL;
   import java.net.MalformedURLException;

   public class OpenWithRegisteredApp {

     public static void main(String[] args) {
       try {
         Desktop.browse(new URL("http://www.java.net/"));
       } catch (MalformedURLException e){
         System.err.println("couldn't connect");
         e.printStackTrace();
       } catch (DesktopException e){
         e.printStackTrace();
       }
     }
   }

예제 프로그램을 컴파일하기 위해서는 jdic.jar 파일을 사용자의 클래스 패스에 포함시켜야한다. 프로그램을 구동하려면 JVM이 찾을 수 있는 곳에 native library가 포함되어 있어야 한다. 또는, 런타임시에 -Djava.library.path=를 사용하여 jar 파일과 native library를 지정할 수도 있다. (native library를 포함하는 디렉토리로의 패스가 뒤따른다). 예를 들어 윈도우에서 jar file과 dll file을 사용자의 프로그램을 포함하고 있는 디렉토리에 복사하면, 다음의 명령문을 사용하여 프로그램을 구동할 수 있다.

   java -classpath jdic.jar;. -Djava.library.path=. 
   OpenWithRegisteredApp

문서 구성상 명령문이 두 라인으로 보여지는 것임을 주의하자. 실제로는 명령문을 한 개의 라인에 입력해야한다.

이에 대한 결과로, 사용자의 기본 브라우저가 열리고 java.net의 처음 페이지를 로딩한다.

Registered App

JDIC API는 또한 native desktop application에 액세스하고 상호작용하기 위해 사용자가 수행하고자 하는 다른 연산을 지원한다. 에디터를 시작하여 특정 파일을 편집할 수 있고, 윈도우를 열어 기본 메일함에서 새로운 메시지를 작성할 수 있으며, 주어진 파일에 등록된 애플리케이션을 실행하거나 파일의 컨텐츠를 프린트할 수도 있다. 이런 메소드들을 사용하는 자세한 방법은 OpenWithRegisteredApp 예제에서 browse()가 사용된 방법과 비슷하다.

그러나 Java 애플리케이션 안에서 웹페이지를 나타내고 싶을 때가 있을 것이다. 외부 웹 브라우저를 띄우는 대신, JEditorPane의 초기 형태로 바꾸지 않고 사용자의 JFrame 안의 웹 컨텐츠를 보이고 싶을 것이다. 또다른 JDIC 컴포넌트인 org.jdesktop.jdic.browser.WebBrowser클래스는 이 이유에서 만들어졌다. WebBrowserjava.awt.Canvas를 확장하여 사용자의 JFrame에 직접적으로 추가될 수 있다. 다음은 WebBrowser 클래스를 이용한 예제이다.

   import org.jdesktop.jdic.browser.WebBrowser;
   import javax.swing.JFrame;
   import javax.swing.SwingUtilities;
   import java.net.URL;
   import java.net.MalformedURLException;
   import java.awt.Dimension;

   public class JDICBrowser {

     private WebBrowser webBrowser = new WebBrowser();

     private void loadStartingPage() {
       try {
         webBrowser.setURL(new URL("http://www.java.net"));
       } catch (MalformedURLException e) {
         System.out.println(e.getMessage());
       }
     }

     private void createAndShowGUI() {
       JFrame frame = new JFrame("JDIC Browser");
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setPreferredSize(new Dimension(700,500));
       loadStartingPage();
       frame.add(webBrowser);
       frame.pack();
       frame.setVisible(true);
     }

     public static void main(String[] args) {
       //Schedule a job for the event-dispatching thread:
       SwingUtilities.invokeLater(new Runnable() {
         public void run() {
           (new JDICBrowser()).createAndShowGUI();
         }
       });
     }
   }

비록 코드는 처음 버전과 비슷하게 보이겠지만, 결과로는 완전히 표현된 웹페이지로 나타난다.

JDIC Browser

텍스트 필드와 버튼을 이 버전이나 첫번째 버전에 추가할 수 있다. 이를 통해 사용자는 다른 페이지의 URL을 입력하고 히스토리를 탐색할 수 있다. WebBrowserListener 클래스를 구현하여 좀 더 나은 사용자 경험을 제공하는데 콜백의 이점을 사용할 수도 있다. 다음은 이에 대한 예제로써 그 메소드들 중 두가지를 구현하는 적용 클래스이다.

  import org.jdesktop.jdic.browser.WebBrowserListener;
   import org.jdesktop.jdic.browser.WebBrowserEvent;

   public class WebBrowserAdapter implements WebBrowserListener {
     public void downloadStarted(WebBrowserEvent e){
       System.out.println("Download Started");
     }
     public void downloadCompleted(WebBrowserEvent e){
       System.out.println("Download Completed");
     }
     public void downloadProgress(WebBrowserEvent e){}
     public void downloadError(WebBrowserEvent e){}
     public void documentCompleted(WebBrowserEvent e){}
     public void titleChange(WebBrowserEvent e){}
     public void statusTextChange(WebBrowserEvent e){}
   }

다음과 같이 createAndShowGUI() 메소드를 수정하여 이 WebBrowserListener 를 추가할 수 있다.

   //...
   loadStartingPage();
   // add the following line:
   webBrowser.addWebBrowserListener(new WebBrowserAdapter());
   ...
JDICBrowser를 재구동시키면 다운로드가 시작/완료되는 표준 반응이 나타난다.
   C:\techtips\May05>java JDICBrowser
   Download Started
   Download Completed
   Download Started
   Download Started
   Download Completed

이번 테크팁의 포인트는 좀 더 나은 브라우저를 구축하는 법을 보여주는 것이 아니라, JDIC 오픈소스 프로젝트의 클래스들을 사용하여 native component를 얼마나 쉽게 통합할 수 있는지 보여주는 것이다.

JDIC에 관한 좀 더 많은 정보는 JDIC project page를 참조하기 바란다.

"Java SE" 카테고리의 다른 글

2005/07/04 10:23 2005/07/04 10:23

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

댓글을 달아 주세요

  1. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

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

    전 많이 공부를 해야지 될 듯 ㅎㅎ

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

◀ Prev 1  ... 504 505 506 507 508 509 510 511 512  ... 626  Next ▶