블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

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
2009. 9. 16. 12:05 Programing/Java
팀내에서 진행하는 프로젝트에 ppt 파일에 포함된 슬라이드를 개별 이미지로 변환해 주는 기능이 필요하여 무료로 제공되는 Apache POI 를 사용해보고 이에 대해 간단히 정리해봅니다.

Apache POI

Apache POI 프로젝트는 Microsoft Format 의 파일들을 엑세스를 지원하는 Java API 라이브러리 입니다. 2009년 9월 16일 현재 3.2 Final 버전과 3.5 beta 6 버전 까지 릴리즈 되었습니다.


POI Components

POI는 MS 오피스의 각 문서 포멧에 대응하는 다양한 컴포넌트를 지원하고 있습니다.


저는 이 중에서 ppt를 위한 컴포넌트인 HSLF를 사용하여 슬라이드를 이미지로 변환하였습니다.
사용법은 무척 간단하고 쉽습니다.

우선 POI 라이브러리를 다운로드 하고 압축을 풀면 3개의 jar 파일을 볼 수 있습니다.(3.2 Final 버전 기준)


HSLF 컴포넌트를 사용하기 위해서는 poi-3.2-FINAL-20081019.jar 와 poi-scratchpad-3.2-FINAL-20081019.jar 파일을 import 해야 합니다.



FileInputStream is = new FileInputStream("slideshow.ppt");
SlideShow ppt = new SlideShow(is);
is.close();
        
Dimension pgsize = ppt.getPageSize();

Slide[] slide = ppt.getSlides();

for (int i = 0; i < slide.length; i++) {
    BufferedImage img
 = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics = img.createGraphics();
    
    //clear the drawing area
    graphics.setPaint(Color.white);
    graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));

    //render
    slide[i].draw(graphics);

    //save the output
    FileOutputStream out = new FileOutputStream("slide-"  + (i+1) + ".png");
    javax.imageio.ImageIO.write(img, "png", out);
    out.close();
}

아래 이미지는 실제 제가 저 코드를 사용하여 클래스를 작성하고 테스트 해본 결과입니다.
3장짜리 ppt 를 변환하니 3장의 png 파일이 만들어졌습니다.


변환된 이미지를 확인해 보니 텍스트가 약간 뭉개지긴 하지만 썩 괜찮은 결과물이었습니다.

마치며

3.2 Final 버전에서는 아직까지 MS Office 2007의 pptx 포멧을 지원하지 않고 있습니다. 다행이도 현재 pptx 지원을 위해 개발 중이라고 하니 다음 릴리즈에서는 pptx 도 문제없이 변환될 것 같습니다.

아주 간단한 코드만으로 ppt 파일을 이미지 파일로 손쉽게 변환 가능하 POI-HSLF 컴포넌트.
만약 PPT파일 변환 기능때문에 고민중이시라면 저는 주저없이 Apache POI 를 권하고 싶습니다.

posted by 초딩입맛제주아재
2007. 9. 8. 00:11 Programing/Java

오늘 JavaOne2007 Wrap-up 세미나 에 다녀왔다.
JavaFX 가 너무 궁굼해서 갔던 세미나였다.
첫번째 세션은 2007 JavaOne에 다녀오신 분이 그 때의 이슈를 소개하는 시간이었는데 듣는 것만으로도 JavaOne이란 행사가 얼마나 재밌고 유익한지 알 수 있었다.
2008 JavaOne에는 참석 할 수 있는 기회가 생길런지...

두번째 세션은 JavaFX에 대한 소개였다.
사실 이 세션 때문에 간것이나 다름 없었는데 뭐랄까...
기대가 너무 컸던것일까?
"JavaFX란 이런것이다" 라는 설명을 듣고 난 후 별 감흥이 없었다.
좀더 화려한 예제를 보길 기대했는데 웹사이트 두 개 보는 것으로 끝나버렸다.

하지만 이 번 세션에서 알아낸것이 있었으니, 바로 JavaFX가 Product Name 이 아니라 Brand Name 이라는것이다.
이 사실을 알기 전에는 Flex=Silverlight=JavaFX 이렇게 생각을 하고 있었다...
JavaFX는 "모든 기기의 통합"을 지향한다.
PC,TV,DVD 플레이어,PDA,핸드폰 등등, 모든 IT기기에서 사용자가 동일한 느낌을 받을 수 있도록 하는것이 목적이라고한다.
PC에서 fiickr에 접속해 사진을 보는것과 핸드폰에서 같은 화면을 볼때 상이한 느낌을 전달해서는 안된다는 것이다.
another device,same experience...(아닌가 ㅡㅡ?)

JavaFX는 브렌드명이고 그 아래에 JavaFX Mobile과 JavaFX Script 가 출시가 되었다.
이 두가지 Product 외에도 계획중인 Product가 네다섯개 더 있는데 시장 규모와 파급 효과가 큰 이 두개를 먼저 출시했다고 한다.

JavaFX Script 에 대해선 자세한 설명이 있었고 샘플 코드도 볼 수 있었다.
발표자는 "easy"를 강조하셨는데 내 생각은 "글쎄..."다.
자바 로고 하나를 만들기 위해 만들어진 수백라인의 코드를 보면서 노가다성 툴이라는 생각이 들었다.
디자이너와의 협업도 문제가 될 것 같고...
머...Sun이니 머지않아 드로잉 툴을 지원해주겠지..하고 위안을 해본다.

세번째 세션은 JMaki에 대한 소개였다.
JMaki가 뭔지 오늘 처음 알았다 ㅡㅡ;
여러가지 javascript toolkit들과의 차이점을 별로 못 느꼈다.
다만 IDE의 지원으로 인해 마우스질로 스크립팅이 가능하다는것...

마지막 세션은 JSF,Hibernate,Spring을 이용한 어플리케이션 개발 소개였다.
발표자가 세미나 발표 경험이 적은지 발표가 매끄럽지 않았다...
Hibernate,Spring 둘 다 관심이 많았는데 세미나 참석자들이 모두 저것들을 다룰줄 안다고 가정한 발표였는지 도통 무슨 말인지 알아 들을 수가 없었다.
아무리 자바관련 세미나라지만 참석하는 사람들이 모두 자바를 사용하는 것은 아닐텐데...

신청할 때 부터 기대가 매우 컸던 세미나였다.
그래서 그만큼 실망도 큰가보다.
그렇다고 시간낭비는 아니었다.
빈약하지만 JavaFX의 샘플 사이트도 봤고, JMaki라는 것도 알게됐고, JavaOne에 꼭 가고 싶게 만든 자료들도 봤으니까...
다음 세미나를 기대해본다...

posted by 초딩입맛제주아재
2007. 9. 3. 23:31 Programing/Java
JavaFX는 또 어떤 신선한 충격을 던져줄까 기대가 크다.
지난 번 오픈마루 스튜디오에서 열린 데브데이에 참석을 못해서 Silverlight 경험을 못해본게 아쉬었는데 이번에는 기필코 JavaFX의 실체를 두 눈으로 확인해야겠다.
Silverlight - JavaFX - Flex
재밌는 싸움이 시작되었다.....

일시: 9월 7일(금) 오후 2시
장소: 강남구 역삼동 포스틸타워 3층 (역삼역 3번출구)
일정: 14:00 - 14:20 등록
       14:20 - 14:50 JavaOne2007 주요 이슈
       14:50 - 15:40 JavaFX의 실체를 밝혀라!
       15:40 - 15:50 휴식
       15:50 - 16:40 비주얼 개발 환경에 jMaki 이용하기
       16:40 - 17:30 JSF, Hibernate, Spring 을 이용한 웹 어플리케이션 개발 소개
참가비: 무료

http://www.sdnkorea.com/blog/427


posted by 초딩입맛제주아재
2007. 2. 24. 21:31 Programing/Java
일시 : 2007.2.24
장소 : 코엑스 그랜드볼룸
시간 내용
10:00
~
11:00
접수 및 입장
11:00
~
11:20
개회사 (옥상훈 JCO 회장) & VIP 동영상
11:20
~
12:20
기조연설 #1 (Matt Thompson / Sun Microsystems)
기조연설 #2 (Dr. Akmal B. Chaudhri / IBM)
12:20
~
12:40
2006 대한민국 소프트웨어 공모대전 (제6회 JCO 자바 소프트웨어 공모전) 시상식
12:40
~
13:00
쉬는 시간 및 트랙 준비, 이동 시간
웹2.0 자바의 향기 개발생산성향상 엔터프라이즈컴퓨팅 소통과 집중
13:00
~
14:00
개발자와
크리에이티브
커먼즈라이선스
(윤종수 판사님)
Java U-City
Middleware Platform
(강신동님)
실용적 프로젝트
관리 방법
(김평철님)
Java EE 5.0 and
Glassfish
(김원석님)
토론 트랙
14:00
~
14:10
쉬는 시간 및 트랙 준비, 이동 시간
14:10
~
15:10
Daum의 자바 개발 로드맵과
개방형 플랫폼 전략
(윤석찬, 박상길 / 다음커뮤니케이션)
Ajax Frameworks for Java Platform
(신상철 박사님 / Sun)
대형시스템의
안정성에 기반한
기업용 자바
애플리케이션 개발
(Christian Strauer / IBM)
TmaxSoft가
바라보는
엔터프라이즈
컴퓨팅의 미래
(최종일 / TmaxSoft)
 
15:10
~
15:20
쉬는 시간 및 트랙 준비, 이동 시간
15:20
~
16:20
Practical Web Tools 활용
(허광남님)
Open Source 와
우리의 과제
(김승권님, 김범준님)
POJO 프로그래밍
(최범균님)
What is SOA?
How to SOA?
(조대협님)
토론트랙
16:30
~
16:40
쉬는 시간 및 트랙 준비, 이동 시간
16:40
~
17:40
What is Web 2.0
(박지강님)
Apache MINA를
이용한 고성능
자바 네트워크
어플리케이션 개발
(이희승님)
Spring 2.0
(이일민님, 안영회님)
SCA 프랙티스
(임철홍님)
토론세션
17:40
~
17:55
쉬는 시간 및 폐회 준비 시간
17:55
~
18:30
경품 추첨 및 이벤트, 폐회사
* 자바인의 밤

자바컨퍼런스에 다녀왔다.
입장시간을 10분가량 넘겨서 도착을 해서 걱정을 했는데 다행히 입장을 금지하지는 않았다.
처음 가보는 행사라 사뭇 긴장을 했는데 괜한 기우였다.
선물도 한 가득 받고(이것이 목적은 아니었다 -_-;;) 기대에는 못미쳤으나 나름 유익한 정보들을 얻을 수 있었다.
동일한 시간에 총 5개의 트랙(회의실)에서 각기 다른 주제로 강연이 이루어졌는데
내가 분신술이 가능한것도 아니고 가장 관심있는 분야인 WEB 2.0에 대한 강연만 줄곧 들었는데
내용이 기대에 못미쳐 아쉬웠다.
POJO프로그래밍과 Spring 2.0을 들을걸...-_-;;
카메라를 가져가지 않았던것도 한이.....


p.s

달룟님과 시즈하님을 만났다..

선물목록
1.구글로고가 새겨진 스텐레스 머그잔
2.구글로고가 새겨진 흰색 면티
3.SUN 로고가 새겨진 USB hub
4.Borland로고가 새겨진 자석 클립
5.IBM로고가 새겨진 스프링 메모장
6.볼펜 2자루

'Programing > Java' 카테고리의 다른 글

2007 JavaOne Warp-Up 세미나 후기  (0) 2007.09.08
JavaOne2007 Wrap-up 세미나  (0) 2007.09.03
윈도우 Java환경 설정  (0) 2006.12.23
에디트플러스 자바 컴파일/실행 설정  (0) 2006.10.16
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 12. 23. 01:27 Programing/Java
내 컴퓨터 -> 속성 -> 고급 -> 환경변수 -> 시스템 변수

1.JAVA_HOME 새로만들기클릭
      변수이름 : JAVA_HOME
      변수값 : 자바 jdk 를 설치한 위치를 지정 예) C:\Program Files\Java\jdk1.5.0_09

2.CLASSPATH 새로만들기클릭
      변수이름 : CLASSPATH
     변수값 : .;%JAVA_HOME%\lib\tools.jar


3.PATH 기존변수수정
      변수이름 : Path
     변수값 : java 가 설치된 디렉토리 밑의 bin 디렉토리 예) C:\Program Files\Java\jdk1.5.0_09\bin;

다 했으면 확인을 누르고 창을 닫자.

이제 설정이 잘 되었는지 확인할 차례

윈도우키+ R 을 누르면 "실행" 다이얼로그가 뜬다.
cmd를 타이핑 하고 엔터.
까만바탕의 커멘드 콘솔이 뜬다.

path를 입력해보자.
조금전에 수정한 path가 뜨면 일단 제대로 설정은 된것.
java를 입력해보자.
뭐라고 주루룩 뜨면 성공.

이제 준비는 끝났다.

'Programing > Java' 카테고리의 다른 글

JavaOne2007 Wrap-up 세미나  (0) 2007.09.03
제8회 한국 자바 개발자 컨퍼런스  (0) 2007.02.24
에디트플러스 자바 컴파일/실행 설정  (0) 2006.10.16
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
SWT Study  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 16. 10:32 Programing/Java
도구 -> 기본설정 -> 도구 - 사용자도구

   우측화면에서 그룹 선택(1번부터 10번까지 있음) 원하는 번호 선택.
   그룹이름 변경 -> Java로 해줌(이건 안해도 되는데 구분을 위해 해줌)

   추가 -> 프로그램 {
       메뉴제목 : Java Compile(사용자 마음대로)
       명령 : 오른쪽 버튼을 클릭하여 javac파일을 찾아 선택해줌.
       인수 : 오른쪽 버튼을 클릭하여 "파일이름" 선택
       디렉토리 : 오른쪽 버튼을 클릭하여 "파일 디렉토리" 선택
       하단의 "출력내용 캡쳐"에 체크
   }

   추가 -> 프로그램 {
        메뉴제목 : Java Run(사용자 마음대로)
       명령 : 오른쪽 버튼을 클릭하여 java파일을 찾아 선택해줌.
       인수 : 오른쪽 버튼을 클릭하여 "확장자를 뺀 파일이름" 선택
       디렉토리 : 오른쪽 버튼을 클릭하여 "파일 디렉토리" 선택
       하단의 "출력내용 캡쳐"에 체크
}

'Programing > Java' 카테고리의 다른 글

제8회 한국 자바 개발자 컨퍼런스  (0) 2007.02.24
윈도우 Java환경 설정  (0) 2006.12.23
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
SWT Study  (0) 2006.10.13
적당한 크기로 만들어주는 메서드 - Control.pack()  (4) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 13. 23:07 Programing/Java

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();
   }
}


'Programing > Java' 카테고리의 다른 글

윈도우 Java환경 설정  (0) 2006.12.23
에디트플러스 자바 컴파일/실행 설정  (0) 2006.10.16
SWT Study  (0) 2006.10.13
적당한 크기로 만들어주는 메서드 - Control.pack()  (4) 2006.10.13
SWT 연습...  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 13. 22:20 Programing/Java

1 소개
1.1 SWT에 대해서
2 SWT 프로그래밍 화경 구축 및 맛보기
2.1 환경 구축
2.2 Hello World를 통해서 익히는 Eclipse+SWT 개발
2.2.1 프로젝트 생성
2.2.2 코드 생성
2.2.3 실행 시키기
3 SWT 프로그래밍 일반
3.1 SWT 애플리케이션의 기본 구조
3.2 SWT 애플리케이션 제작
3.3 SWT 패키지들
3.4 다이얼로그
3.5 Widgets
3.5.1 위젯 이벤트
3.5.2 자주사용하는 위젯
3.5.3 버튼
3.5.4 slider, scale, progressBar 위젯
3.5.5 텍스트 위젯
3.5.6 List 위젯
3.5.7 Sash 위젯
3.6 Composite 위젯
3.6.1 Table 위젯
4 관련 위키

1 소개 #

SmartDic프로젝트를 진행하기 위해서 javaGUI라이브러리인 SWT를 필요로 한다. 아직까지 SWT를 다루어 본적이 없으므로 프로젝트의 원할한 진행을 위해서 SWT에 대한 스터디를 수행하기로 했다.

예제들은 Eclipse를 이용해서 작성하고 테스트하도록 하겠다. Eclipse의 사용방법은 SWT 스터디 위키를 참고하기 바란다.

1.1 SWT에 대해서 #


SWT #

java에서 GUI를 지원하기 위한 도구로 sun에서 개발한 Swing이 널리 사용되고 있었는데, IBM에서 통합개발 플랫폼인 Eclipse를 개발하면서 Swing 대신 자체적으로 개발한 GUI라이브러리를 제작한다. 이게 SWT 이다.

  • Swing : ?J2SE를 위한 GUI 툴킷
  • SWT : IBM의 공개 프로젝트인 Eclipse 플랫폼의 제작을 위해 별도로 개발된 라이브러리
SWT는 Standard Widget Toolkit의 줄임말로 각 운영체제자체에서 제공되는 위젯 툴킷을 통합한 그래픽 라이브러리다. 이는 각 타겟 플렛폼에 꽤나 의존적이 될 수도 있음을 의미하지만, OS독립적인 API를 제공함으로써 이 문제를 해결하고 있다. 이들 API는 목표가 되는 운영체제 시스템의 GUI코드를 wrapper함으로써 개발자 입장에서는 운영체제에 신경쓰지 않고 동일한 코드를 유지할 수 있게 된다.

덧붙여 설명하자면, Swing은 모든 위젯이 운영체제와 별개를 사용하는데(자바의 모토가 One make All use 아니던가) 그렇기때문에 Swing의 GUI는 웬지 눈에 낯설고 어색해 보이는 면이 있어왔다. 그러나 SWT는 가능한한 사용할 수있는 모든 Native Widget은 사용하고, 그러하지 않는 부분만 자바의 자체 위젯을 사용한다. 때문에 최대한 그 OS의 Native GUI와 비슷한 모습을 보여주는것이다.(Native에서 제공하지 않는 자체 위젯까지 포함하므로 때론 더 이쁠수도 있겠다. 물론 반대인 경우도 있겠지만).

그럼 자바가 시스템에 독립적이지 않은게 아닌가? 하고 반문할지 모르지만 위에 설명된 바와같이 공통적인 API를 사용하므로서 (Abstract Layer라고 볼 수 도 있겠다) OS가 다르다고 해서 소스코드의 변경을 필요로 하지 않는것이다. (VM차원에서 Native Widget를 해당 API로 랩핑해주므로)

다음은 현재 java에서 사용중인 GUI라이브러리에 대한 비교다.
Component SWT Swing AWT
Button X X X
Advanced Button X X
Label X X X
List X X X
Progress Bar X X
Sash X X
Scale X X
Sash X X
Slider X X
Text Area X X X
Advanced Text Area X X
Tree X X
Menu X X
Tab Folder X X X
Toolbar X X
Spinner X X
Tabler X X X
Advanced Table X X


2 SWT 프로그래밍 화경 구축 및 맛보기 #

2.1 환경 구축 #

우선은 개발환경을 구축해야 한다. 기본 개발환경은 Linux, ?JDK1.4기반이며 스터디를 위해서 Eclipse를 설치하기로 했다. 아무래도 SWT가 Eclipse의 일부로 개발된 측면이 있기 때문에 자연스러운 학습을 위해서 Eclipse가 필요하다고 판단되었기 때문이다.

Eclipse는 http://www.eclipse.org에서 최신버전 3.0 (04/7/27일 현재)받을 수 있다. 설치는 압축푸는 걸로 끝이다. 이클립스와 함께 SWT개발과 관련된 라이브러리도 받아야 한다. 역시 위 사이트에서 받을 수 있다. SWT라이브러리를 받은다음 이클립스를 설치한 곳에 적당한 디렉토리를 만들어서 압축을 풀도록 하자. 필자의 경우 이클립스 설치디렉토리는 /usr/eclipse에 SWT는 /usr/eclipse/jar에 풀었다.

다음은 이클립스를 통한 개발 모습이다.


2.2 Hello World를 통해서 익히는 Eclipse+SWT 개발 #

자바플렛폼에서의 개발이 그리 익숙치 않은 관계로 우선 SWT버젼의 Hello world출력 애플리케이션을 만들어 보기로 했다.

2.2.1 프로젝트 생성 #
이클립스가 실행되었다면, 새로운 File > New > Project 를 이용해서 새로운 프로젝트를 생성해야 한다. 그러면 아래와 같은 Project 생성 Wizard가 뜨게 된다.


여기에서 java > java project 를 선택하고 Next 버튼을 클릭하도록 한다. 이제 프로젝트의 이름을 선택해 주어야 하는데, ?HelloWorld로 하자. 그다음 Finish 버튼을 누른다. 그럼 아래의 그림과 같이 ?HelloWorld 프로젝트가 생성된걸 확인할 수 있다.


2.2.2 코드 생성 #
프로젝트도 만들어지고 했으니 이제 코드를 생성해 보기로 하자. ?HelloWorld 프로젝트 이름을 마우스로 클릭한후 오른쪽 버튼을 클릭하면 팝업메뉴가 뜨는데 여기에서 New > Class를 선택하도록 한다. 그러면 Java Class 생성화면이 나오는데 Name에 ?HelloWorld를 넣고 Finish버튼을 클릭해서 새로운 클래스를 만들어 내도록 한다.

그러면 아래와 같이 ?HelloWorld.java 에디터 화면이 생성된걸 확인할 수 있다.


이제 코드를 완성하도록 하자. 다음은 ?HelloWorld출력을 위한 코드다.
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.*;


public class HelloWorld{
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.NONE);
label.setText("Hello World!");
shell.pack();
label.pack();
shell.open();

while(!shell.isDisposed())
if(!display.readAndDispatch())
display.sleep();
display.dispose();
label.dispose();
}
}

그데 몇몇라인을 보면 빨간색 밑줄이 그어져 있는 것을 볼 수 있을 것이다. 이는 코드에 문제가 있다는 건데, 우리가 swt관련 패키지를 지원할 수 있도록 포함시키지 않았기 때문에 발생하는 에러다. C로 말하자면 -l"라이브러리" 를 하여 라이브러리를 링킹하지 않은것과 비슷하다고 볼 수 있겠다.

이문제의 해결을 위해서는 프로젝트에 swt와 관련된 JAR파일을 추가시켜줘야 한다. 추가시키는 방법은 : 프로젝트 이름을 선택하고 마우스 왼쪽 버튼 클릭후 Properties를 클릭하도록 한다. 여기에서 java Build Path > Libraries를 선택하도록 한다. 그다음 Add External Jars를 클릭해서 SWT관련 JAR파일을 추가시켜주면 된다.


2.2.3 실행 시키기 #
이제 실행시키는 일만 남았다. 마찬가지로 우선 ?HelloWorld 프로젝트를 선택한다음 Run > Run 을 선택하도록 하자.

그러면 다음과 Run환경 설정창이 뜬다. 이 화면을 통해서 우리는 각종 실행 인자와 환경변수와 같은 실행환경을 설정할 수 있다. C코드로 부터 실행파일을 만들때 가장 마지막으로 하는 일이 필요한 오브젝트나 라이브러리를 링크하는 작업이 있다. 마찬가지로 java환경에서도 이러한 작업이 필요로 한다. 우리가 만든 Hello World프로그램의 경우 SWT패키지를 사용하고 있으므로 SWT라이브러리를 사용하라고 알려줄 필요가 있다.

이것은 다음과 같이 VM arguments 에 SWT라이브러리의 경로를 명시해줌으로써 알려줄 수 있다. 경로는 자신의 eclipse 설치 디렉토리에 따라 달라질 수 있다.


swt관련 라이브러리의 경로는 리눅스를 기준으로 ./eclipse/plugins/org.eclipse.swt.gtk_3.0.0/os/linux/x86이다. 참고하기 바란다.

이제 Run 버튼을 클릭해서 실행하도록 하자. 다음과 같은 실행결과물을 확인할 수 있을 것이다.


3 SWT 프로그래밍 일반 #

3.1 SWT 애플리케이션의 기본 구조 #

SWT 애플리케이션은 블럭구조를 가지며 Display, Shell, Widget의 기본 블럭들로 이루어진다. Dispalys는 이벤트 loop를 관리하고 UI 쓰레드와 다른 쓰레드들간의 통신을 제어한다. Shell은 OS의 윈도우 메니저에 의해서 생성되는 윈도우 창을 관리한다. 모든 SWT 애플리케이션은 적어도 하나의 Dispaly와 하나 혹은 그 이상의 Shell 인스턴스를 필요로 한다.

http://www.developer.com/img/articles/2004/03/25/figure_01.gif

위 그림은 SWT 애플리케이션의 대략적인 구성을 서로 다른 관점을 통해서 보여주고 있다. 첫번째 다이아 그램은 UI 객체의 상속관계를 나타내고 있다. 두번째 다이아 그램은 UI 객체의 컨태이너 구조체를 보여주고 있다. 세번째 다이아 그램은 만들어진 UI를 보여준다.

만약 애플리케이션이 다중 쓰레드를 이용한다면 각각의 쓰레드는 자신의 Display 인스턴스를 만들게 된다. 프로그래머는 Display.getCurrent()메서드를 이용해서 최근 활성화된 Dispaly의 인스턴스를 가져올 수 있다.

Shell은 운영체제에서 윈도우를 나타내기 위해서 사용된다. shell은 maximized, normail, minimized 형태를 가질수 있다. shell 두가지 타입이 있다. 하나는 top-level shell로 자식을 생성하며 Display의 메인 윈도우가 된다. 다른 하나는 dialog shell로 다른 shell과 독립된다.

shell의 타입은 쉘의 생성자에 의해서 넘겨지는 style bit 값에 의존적이다. 기본적으로 쉘은 ?DialogShell 타입이 된다. 이는 아무런 인자 없이 만들경우 ?DialogShell이 만들어진다는 뜻이다.

몇몇 위젯의 특성(properties)는 반드시 생성시간에 설정되어야 한다. 이러한 위젯 특성을 style bits라고 부른다. Style bits는 SWT 클래스에 상수로 정의되어 있다. 예를들자면 Button button = new Button(shell, <styleBits>)형식으로 사용할 수 있다. sytle bits는 OR연산자 |를 이용할 수 있다. 만약 테두리가 있는 입력버튼을 만들기를 원한다면 SWT.PUSH | SWT.BORDER 해주면 된다.

3.2 SWT 애플리케이션 제작 #

SWT 애플리 케이션은 다음과 같은 순서로 만들어 진다.
  • Display 생성
  • 하나 이상의 shell 생성
  • shell의 레이아웃 설정
  • shell에 포함될 위젯 생성
  • shell windows을 연다.
  • event dispatching loop 작성
  • display의 배치
다음은 SWT 애플리케이션의 일반적인 구성이다.
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SliderExample {
public static void main(String args[]) {
Display display = new Display();
// 1
Shell shell = new Shell(display);
// 2
shell.setLayout( new RowLayout());
// 3
// -------------------------------
// 여기에 적당한 코드를 넣는다.
// -------------------------------
shell.pack();
shell.open();
// 4
while( !shell.isDisposed())
// 5
{
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
// 6
}
}

위 예제는 실제 코드가 없기 때문에 비어있는 윈도우를 생성한다. 이를테면 SWT애플리케이션 제작을 위한 템플릿 코드정도로 생각하면 된다.

  1. 모든 SWT애플리케이션은 Dispaly와
  2. 하나 이상의 Shell을 필요로 한다. shell은 객체의 조합이다.
  3. 만약 layout을 잡지 않는다면, 추가된 위젯은 보이지 않게 된다.
  4. 만들어진 shell을 연다.
  5. 이벤트 핸들링 루프를 만들고 GUI 이벤트를 읽는다.
  6. 사용되지 않는 display를 버린다.

3.3 SWT 패키지들 #

SWT는 여러개의 패키지로 구성되어 있다. 이들 패키지에 대한 자세한 내용은 Eclipse API 문서에 정의되어 있다. 여기에서는 중요한 패키지들을 간단하게 설명하도록 하겠다.

  • org.eclipse.swt : SWT 클래스에 의해서 사용되는 상수와 예외값들이 정의되어 있다. SWT패키지는 SWT, ?SWTException, ?SWTError 3개의 클래스로 구성되어 있다. SWT는 keyboard, error, color, layout, text sylte, button등과 같은 가장 자주 사용되는 라이브러리들을 포함하고 있다.
  • org.eclipse.swt.widgets : 핵심 SWT 위젯 컴포넌트들과 위젯을 지원하기 위한 인터페이스와 클래스들을 포함하고 있다.
  • org.eclipse.swt.events: SWT 컴포넌트들에 의해 사용되는 이벤트 타입과, 리스너, 이벤트들을 정의하고 있다. 이 패키지는 Listener interfaces, Adapter class, Event class를 포함하고 있다.
  • org.eclipse.swt.dnd : SWT 위제에서 drag-and-drop을 지원하기 위한 클래스를 포함한다.
  • org.eclipse.swt.layout : SWT위젯의 자동크기변화와 위치지정과 관련된 클래스를 포함한다.
  • org.eclipse.swt.print : 출력을 위한 클래스 포함
  • org.eclipse.swt.graphics : 점, 선, 면, 색, 커서, 폰트, Graphics context등 이미지와 관련된 클래스를 제공한다.

3.4 다이얼로그 #

다이얼로그는 운영체제의 윈도우 환경에서 지원하는 것을 사용한다. 예를들어 리눅스라면 GTK에서 지원하는 다이얼로그를 사용하게 된다. SWT의 다이얼로그는 Dialog 클래스로 부터 파생된다. dialog는 위젯이 아니지만 위젯을 포함할 수 있다.

http://www.developer.com/img/articles/2004/03/25/figure_02.gif

어떤 다이얼로그들은 properties 를 조정할 수 있다. 다이얼로그는 아래와 같이 사용할 수 있다.
MessageBox messageBox = new MessageBox(shell, SWT.OK|SWT.CANCEL);
if (messageBox.open() == SWT.OK) {
System.out.println("Ok is pressed.");
}
각 다이얼로그는 open()메서드를 이용해서 다른 타입을 리턴받을 수 있다. 예를 들어서 ?MessageBox dialog는 open()메서드로 부터 int 값을 리턴받는다. 그러므로 각각의 다이얼로그 마다 리턴되는 타입에 맞도록 처리를 해주어야 한다.

?ColorDialog는 색선택 창을 보여주는데, RGB 객체를 리턴한다.

?DirectoryDialog는 디렉토리 선택을 위한 창을 보여주는데, open()메서드를 사용할 경우 선택된 디렉토리의 이름(문자열)을 리턴한다.

Font dialog는 시스템에서 제공하는 모든폰트에 대한 목록을 제공하고 선택할 수 있도록 한다. ?FontData 객체가 리턴된다.

?FileDialog는 파일선택 창을 띄운다. 여기에 더해서 확장자 필터, 경로 필터, 파일이름 필터등을 적용할 수 있다. 다이얼로그는 다음과 같은 타입을 가지고 있다.

SWT.OPEN Open 버튼을 보여준다. 파일을 열고자 할때 사용한다.
SWT.SAVE Save 버튼을 보여준다. 파일을 저장할때 사용한다.

?PrintDialog는 프린트와 관련된 여러가지 조작을 할 수 있는 창을 보여준다. open()메서드를 호출했을 경우 ?PrintData 객체를 리턴한다.

?MessageBox 다이얼로그는 사용자와 상호작용하기 위해서 사용할 수 있다. 다이얼로그는 목적에 따라서 여러가지 타입을 가질 수 있는데, 아래와 같이 | 연산을 통해서 다양한 타입을 만들어 낼 수 있다.
MessageBox messageBox = new MessageBox(shell,SWT.OK|SWT.CANCEL|SWT.ICON_WARNING);
messageBox.setMessage("www.korayguclu.de"); messageBox.open();
이렇게 해서 만들어진 다이얼로그는 다음과 같이 보일 것이다. 아래 그림은 리눅스에서 실행시킨 경우다. http://www.joinc.co.kr/albums/album01/akl.png ?MessageBox에서 사용할 수 있느 아이콘은 아래에 정리해 두었으니 참고하기 바란다. || SWT.ICON_ERROR || http://www.developer.com/img/articles/2004/03/25/image_01.gif ||
SWT.ICON_INFORMATION http://www.developer.com/img/articles/2004/03/25/image_02.gif
SWT.ICON_QUESTION http://www.developer.com/img/articles/2004/03/25/image_03.gif
SWT.ICON_WARNING http://www.developer.com/img/articles/2004/03/25/image_04.gif
SWT.ICON_WORKING http://www.developer.com/img/articles/2004/03/25/image_02.gif

3.5 Widgets #

위젯은 윈도우를 구성하는 공통 GUI객체다. 버튼, 체크박스, 팝업메뉴, 슬라이드바, 스핀박스, 텍스트 입력창등이 여기에 포함된다.

SWT GUI 객체는 widget과 Control 클래스로 부터 파생된다. 위젯 객체는 모든 공통 GUI클래스를 위한 기본 클래스와 메서드를 정의하고 있다. Control 클래스는 모든 windowed GUI 클래스의 기본 클래스로 윈도우와 다이얼로그의 display와 관련된 제어를 맡는다.

다음은 위젯의 계층구조를 나타낸 그림이다.

http://www.developer.com/img/articles/2004/03/25/figure_04.gif

3.5.1 위젯 이벤트 #
3.5.2 자주사용하는 위젯 #
http://www.developer.com/img/articles/2004/03/25/figure_05.gif

모든 Control 클래스는 border를 가질 수 있다. border는 SWT.BORDER 상수를 이용해서 추가 시킬 수 있다.

3.5.3 버튼 #
버튼은 다양한 스타일을 가지고 있으며 bit값에 의해서 설정할 수 있다. 아래의 테이블은 버튼과 그 스타일을 정리한 테이블이다.

상수 사용예 설명
SWT.ARROW http://www.developer.com/img/articles/2004/03/25/image_05.gif popup메뉴등을 위해서 사용한다.
SWT.CHECK http://www.developer.com/img/articles/2004/03/25/image_06.gif 체크박스
SWT.PUSH http://www.developer.com/img/articles/2004/03/25/image_07.gif 푸쉬버튼
SWT.RADIO http://www.developer.com/img/articles/2004/03/25/image_08.gif 라디오 버튼
SWT.TOGGLE http://www.developer.com/img/articles/2004/03/25/image_06.gif 푸쉬버튼과 비슷하지만 버튼을 누르면 이전의 누름버튼은 원상태로 된다.

3.5.4 slider, scale, progressBar 위젯 #
scale는 연속된 범위내에서 특정한 값을 선택하기 위해서 사용하는 위젯이다. 범위는 Scale 클래스의 setMinimum()과 setMaximum()메서드를 이용해서 정할 수 있다. 선택된 값은 getSelection()메서드를 이용하면 된다. scale는 한번에 하나의 값만을 가져올 수 있다.

http://www.developer.com/img/articles/2004/03/25/figure_06.gif

생성자를 통해서 넘기는 인자를 통하여 다른 모양의 scale와 slider위젯을 생성할 수 있다. slider와 scale를 위해서 사용되는 상수는 아래와 같다.

SWT.HORIZONTAL 수평으로 배치
SWT.VERTICAL 수직으로 배치

옵션으로 SWT.BORDER 상수를 이용해서 scale주변에 테두리를 만들어 줄수 있다.
final Slider slider = new Slider(shell,SWT.VERTICAL);
slider.setMinimum(0);
slider.setMaximum(100);
slider.setIncrement(5);
slider.setPageIncrement(10);
slider.setSelection(25);
slider.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
System.out.println("Selection:"+ slider.getSelection());
}
});

?ProgressBar 위젯은 Slider, Scale 위젯과 비슷하다. 그러나 선택이 불가능하다. 이것은 어떤 작업의 진척정도를 나타내기 위해서 사용한다. SWT.SMOOTH와 SWT.INTERMINATE 상수를 이용해서 ?ProgressBar 위젯을 변경할 수 있다.

3.5.5 텍스트 위젯 #
Text 위젯은 텍스트 편집창을 만들기 위해서 사용한다. 필요에 따라서는 하나의 편집창에서 서로 다른 폰트와 색을 동시에 출력하는 기능을 가진 ?StypleText 위젯을 사용할 수도 있다.. 이 위젯을 사용하면 전경색, 배경색과 폰트를 문자단위로 지정해 줄 수 있다.

http://www.developer.com/img/articles/2004/03/25/figure_07.gif

다음은 text 편집창을 만드는 예제 코드다.
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Slider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Text;
public class SliderExample {
public static void main(String args[]) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout( new RowLayout());
Text text = new Text(shell, SWT.MULTI|SWT.WRAP);
text.setText("Hello world!!");
shell.pack();
shell.open();
while( !shell.isDisposed()) {
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}

3.5.6 List 위젯 #
List widget은 목록중에서 하나의 원소를 선택할 수 있는 인터페이스르 제공한다. 만약에 요소들중 하나를 선택하게 되면 이벤트 리스너에게 신호를 보내게 된다(QT의 슬롯,시그널 개념과 비슷하다.). SWT.SINGLE와 SWT.MULTI를 이용해서 단일 혹은 다중 선택이 가능하다. 리스트 위젯은 기본적으로 스크롤이 가능한 위젯임으로 SWT.H_SCROLL과 SWT.V_SCROLL 상수를 이용할 수 있다.

http://www.developer.com/img/articles/2004/03/25/figure_08.gif

final List list = new List(shell,SWT.MULTI);
for (int i = 1; i < 11; i++) {
list.add(i+".)www.korayguclu.de");
}
list.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
List list = (List) e.getSource();
String[] str = list.getSelection();
for (int i = 0; i < str.length; i++) {
System.out.println("Selection: "+str[i]);
}
}
});

3.5.7 Sash 위젯 #
Sash 위젯은 여러개의 위젯이 포함되었을 때, 서로의 영역을 변경할 수 있도록 만들어 준다. 마우스를 Sash 경계에 가져가면 좌우 화살표 혹은 상하 화살표로 바뀌면서 영역의 크기를 조정할 수 있도록 만들어준다.

http://www.developer.com/img/articles/2004/03/25/figure_09.gif

Button button = new Button(shell,SWT.PUSH);
button.setText("Button0");
Sash sash = new Sash(shell, SWT.VERTICAL);
Button button1 = new Button(shell,SWT.PUSH);
button1.setText("Button1");

3.6 Composite 위젯 #

Composite 위젯은 다른 위젯들을 포함해서 그룹화하고 배열시키기 위한 일종의 Container 위젯이다. 또한 위젯 뿐만 아니라 Composite위젯 클래스 자체를 포함시킬 수도 있다. SWT의 Composite는 Swing의 그것다는 달리 add 메서드를 제공하지 않는다. 대신 생성자를 통해서 필요한 위젯을 배치시켜줘야만 한다.

그리고 아래 그림에서 처럼 Shell 자체를 포함시킬 수도 있다.

http://www.developer.com/img/articles/2004/03/25/figure_10.gif

Composite 위젯은 스크롤 가능한 위젯으로 상수 SWT.H_SCROLL 과 SWT.V_SCROLL을 이용해서 스크롤을 추가시킬 수도 있다.

3.6.1 Table 위젯 #
테이블 위젯은 문자열이나 이미지를 출력하기 위한 위젯이다.

posted by 초딩입맛제주아재
2006. 10. 13. 22:11 Programing/Java
 final Button button = new Button(shell,SWT.BUTTON1);
 button.pack();
 button.setSize(100,30);
 button.setText("눌러봐");
 button.pack();
 
 final Button closebutton = new Button(shell,SWT.BUTTON1);
 closebutton.pack();
 closebutton.setSize(100,30);
 closebutton.setLocation(110, 0);
 closebutton.setText("창닫어");

위 버튼은 다음과 같이 출력된다.


두개의 버튼은 각각 100,30 으로 크기를 지정해 주었다.
오른쪽의 창 크기가 100 * 30으로 지정한 크기대로 출력이 되었다.
왼쪽 창의 크기는 지정해준 크기가 아니다.
두 코드의 다른점을 보면 오른쪽 버튼의 소스에는 Control.pcak()메서드가 없다.

Control.pack()메서드의 역할은 바로 이것이다.
적당한 크기로 바꿔주는것.

일일이 control마다 setSize를 해줄 필요가 없을것 같다.

'Programing > Java' 카테고리의 다른 글

윈도우 Java환경 설정  (0) 2006.12.23
에디트플러스 자바 컴파일/실행 설정  (0) 2006.10.16
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
SWT Study  (0) 2006.10.13
SWT 연습...  (0) 2006.10.13
posted by 초딩입맛제주아재
2006. 10. 13. 21:54 Programing/Java

import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.*;

public class SWTExample{

  public static void main(String[] args){
    Display display = new Display();
 
Shell shell = new Shell(display);
shell.pack();
// shell.setLayout(new GridLayout());
shell.setSize(450, 400);
shell.setText("This is a window using SWT");


final Button button = new Button(shell,SWT.BUTTON1);
button.pack();
button.setSize(100,30);
button.setText("눌러봐");

final Button closebutton = new Button(shell,SWT.BUTTON1);
closebutton.pack();
closebutton.setSize(100,30);
closebutton.setLocation(110, 0);
closebutton.setText("창닫어");

Listener listener = new Listener(){
  public void handleEvent(Event event){
   if(event.widget == button){
    System.out.println("눌렀네");
   }else if(event.widget == closebutton){
    System.out.println("닫어");
   }
  }
};

button.addListener(SWT.Selection,listener);
closebutton.addListener(SWT.Selection, listener);

shell.open();
 
   
   while(!shell.isDisposed())
       if(!display.readAndDispatch())
     display.sleep();
        
   display.dispose();
}
}



posted by 초딩입맛제주아재
prev 1 next