넷빈(NetBeans)6.9에서 모듈(설치 프로그램 XX.exe 포함) 만들기-02-WordApp

0

Written on 오전 7:10 by 강여사(J.Y.Kang)

이번 게시물 역시 넷빈즈 플랫폼에 대한 프로젝트 입니다.

이번에는 좀더 확장하여 4개의 모듈을 사용하는 모듈 어플리케이션을 작성하고 이 어플리케이션에 대한 브랜딩(아이콘, 스플래시스크린 및 기타 정보 설정)과 빌드 인스톨러(.exe 만들기)를 통해 넷빈 6.9에서 새롭게 선보이는 편리한 기능들에 대해서도 알아보겠습니다.

작업환경은 다음과 같습니다.

넷빈 6.9
JDK 5 이상 (저는 JDK6update20 사용중입니다)

우선 새 프로젝트를 만듭니다. 프로젝트 창에서 마우스 오른쪽 클릭 - 새 프로젝트
카테고리에서 넷빈즈 모듈을 선택한 후 이번에는 넷빈즈 플랫폼 어플리케이션(NetBeans Platform Application )을 선택합니다 - 다음
프로젝트 이름은 WordApp
경로는 적당히
프로젝트 플랫폼을 선택할 수 있는데, 플랫폼을 미리 여러개 등록해 놓으면(플랫폼 등록은 상단의 도구 메뉴에서 넷빈즈 플랫폼을 선택한 후 팝업창에서 본인 컴퓨터에 설치되어 있는 여러 넷빈즈 플랫폼을 선택하시면 됩니다. 저는 그림처럼 여러개가 선택되어 있어 해당 사항이 뜬거고, 게시물을 위해서는 그냥 넷빈 6.9를 선택하여 진행하겠습니다) - 다음
만들어진 모듈 어플리케이션의 모듈 노드에서 오른쪽 마우스를 클릭하면 새로 추가가 뜹니다. 클릭
새 모듈 프로젝트창이 팝업으로 뜨는데,
첫번째 모듈 프로젝트 이름은 WordEngine
경로는 기본사항대로 - 다음
모듈에 대한 고유 이름을 지정해야 하는데 이걸 코드 이름 베이스 라고 합니다.
이 모듈의 코드 이름 베이스는 org.demo.wordengine 으로 줬습니다.
나머지 사항은 기본대로 - 마침
만들어진 모듈 (WordEngine) 에서 마우스 오른쪽을 클릭하여 새로 만들기 - other
카테고리에서 모듈 개발을 선택한 후 창(Window Component) 를 새 파일 유형으로 선택합니다 - 다음
기본 설정이 뜨는데 output 으로 설정하고 다음
클래스의 접두사 이름을 "Text" 로,
패키지 이름은 "org.demo.wordengine" 으로 줍니다.
이 설정으로 마법사가 아래 만들어지는 폼과 자바 파일, 그리고 XML 파일들을 자동 생성되는 걸 확인할수 있습니다.
마침
그럼 가운데 편집기에 디자인 편집창이 나타납니다. 오른쪽 파레트에서 버튼 하나와 텍스트영역(TextArea) 하나를 각각 드래그 해서 아래 그림 처럼 놓습니다. 버튼 이름은 Filter! 로 변경하고(오른쪽 파레트 아래 속성에서 text 항목을 편집하면 됩니다).
텍스트영역을 마우스로 클릭한 후 오른쪽 마우스를 열면 변수 이름 변경 메뉴가 있습니다. 클릭
변수 이름을 text 라고 변경합니다. (텍스트영역의 id 를 바꾸는 작업입니다)
그런 다음 버튼을 더블 클릭하면 아래 그림처럼 소스 창으로 자동 전환됩니다. 그럼 해당 메소드에 다음 코드를 작업합니다. (굵은 글씨 참고)
=================================================================
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
s = s.toUpperCase();
text.setText(s);

}
=================================================================
이제 어플리케이션에서 마우스 오른쪽을 클릭하여 실행합니다. 모듈이 설치되어 있는 넷빈즈 플랫폼 어플리케이션 WordApp 가 시작됩니다.
아래 그림 처럼 넷빈즈 플랫폼 기반 어플리케이션 WordApp 가 뜨는데 이 때 창을 클릭하면 좀전에 만든 창 컴포넌트 Text 가 보입니다. 클릭
그럼 아래쪽에 Text Window 가 나타나고 아래 텍스트 영역과 버튼이 제시됩니다. 그림처럼 hello world 라고 적고 Filter! 버튼을 클릭하면,
작성한 글씨가 모두 대문자로 바뀌어 텍스트 영역에 나타납니다.
***********************************************************************
이제 2개의 부가 모듈을 만들어 보도록 하겠습니다. 처음 만들 모듈은 서비스로, 그리고 다음 모듈은 앞서 정의한 모듈을 제공하는 모듈입니다.
다시 WordApp 의 모듈 노드에서 마우스 오른쪽을 클릭하고 새로 추가를 선택합니다.
새 모듈 프로젝트 이름을 TextFilter 라고 줍니다. 경로는 기본대로 - 다음
코드 이름 기본(code name base):는 org.demo.textfilter 로 나머지는 기본 사항대로 - 마침
그런 다음 TextFilter 모듈에서 마우스 오른쪽을 클릭하여 자바 인터페이스를 새로 만듭니다. 새로 만들기-자바 인터페이스 클릭
인터페이스 이름은 TextFilter , 패키지는 org.demo.textfilter 마침
다음 메소드 선언을 추가합니다.
==========================================================
package org.demo.textfilter;

public interface TextFilter {

String process(String s);
}
==========================================================
TextFilter 모듈에서 마우스 오른쪽을 클릭하고, 맨 아래 등록정보를 선택합니다
등록정보의 카테고리에서 API 버전제어를 선택하고 아래 그림처럼 공개 패키지에 체크합니다. OK
3번째 모듈을 새로 만듭니다. 모듈에서 마우스 오른쪽 클릭 - 새로 추가
프로젝트 이름: MyFilter 기본대로 - 다음
코드 이름 기본에 "org.demo.myfilter" 라고 줍니다. 나머지는 기본 사항대로 - 마침
만들어진 MyFilter 모듈에서 다시 마우스 오른쪽을 클릭하여 등록정보를 누릅니다
프로젝트 창의 라이브러리에 새로 만들어진 MyFilter 모듈에 TextFilter 모듈을 추가하기 위해 다음과 같이 작업합니다.
우선 라이브러리를 클릭하고, 모듈 의존성탭에서 새 의존성 추가(Add Dependency...) 클릭하고,
팝업창이 뜨면 맨위 필터에서 TextFilter 를 입력합니다.
그럼 아래에 모듈이 찾아지는데 이걸 OK
확인
같은 방법으로 이번에는 Lookup 을 입력하여 찾아보기(Lookup API) 모듈을 추가합니다. ok
그럼 아래 그림처럼 표시 됩니다. 확인
이제 2번째 모듈의 인터페이스에서 정의했던 메소드를 구현하기 위한 클래스 작업을 합니다.
마우스 오른쪽 클릭 - 새로 만들기 - 자바 클래스
클래스 이름: UpperCaseFilter
패키지: org.demo.myfilter
마침
클래스를 아래 내용으로 작성합니다.
============================================================
package org.demo.myfilter;

import org.demo.textfilter.TextFilter;

@ServiceProvider(service=TextFilter.class)

public class UpperCaseFilter implements TextFilter {

public String process(String s) {
return s.toUpperCase();
}

}
============================================================
@ServiceProvider 어노테이션은 컴파일시,TextFilter 인터페이스의 구현을 등록하는 파일과 함께 META-INF/services 폴더를 만들게 됩니다. 보다 자세한 내용은 JDK 6 ServiceLoader 메카니즘을 살펴보시기 바랍니다.
임포트 문제는 여백에서 마우스 오른쪽을 클릭 - 가져오기 고정(fix import)
임포트 및 코드 확인
이번엔 WordEngine 에 TextFilter 작업을 하기 위해 다음과 같이 합니다. 우선 WordEngine 에서 마우스 오른쪽 클릭 - 등록 정보 선택
WordEngine 등록정보 창에서 카테고리에 라이브러리를 선택 후 모듈 의존성에 새 종속성 추가 버튼을 클릭한 후 팝업창에서 TextFilter 를 입력하여 모듈을 찾은 후 ok
아래 그림처럼 TextFilter 가 라이브러리에 추가되었음을 확인합니다. ok
아까 버튼의 메소드 부분을 다음과 같이 변경합니다. (굵은 글씨 참고)
================================================================
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
if (filter != null) {
s = filter.process(s);
}
text.setText(s);
}
================================================================
임포트 문제는 역시 여백에서 마우스 오른쪽 클릭 가져오기 고정(fix import) 클릭
이로써, 버튼의 기능은 같지만, 새 모듈 디자인을 추가함으로써 필터 구현과 그래픽 유저 인터페이스 간의 분리를 제공하게 됩니다.
이제 4번째 모듈을 만듭니다. 이 모듈은 첫번 째 모듈에서 만든 "Filter!" 버튼을 클릭할 때 마다 동적으로 텍스트를 받습니다.
우선 첫번째 모듈(TextTopComponent.java) 생성자 부분에서 아래 코드 내용(굵은 글씨)을 추가합니다.
======================================================================= private InstanceContent content;

private TextTopComponent() {
initComponents();
setName(NbBundle.getMessage(TextTopComponent.class, "CTL_TextTopComponent"));
setToolTipText(NbBundle.getMessage(TextTopComponent.class, "HINT_TextTopComponent"));
// setIcon(Utilities.loadImage(ICON_PATH, true));

content = new InstanceContent();
associateLookup(new AbstractLookup(content));

}
=======================================================================
임포트 문제는 마우스 오른쪽 클릭 - 가져오기 고정(fix import) 클릭
그런 다음, 버튼 클릭시마다 InstanceContent 객체가 추가될 수 있도록 소스를 변경합니다(굵은 글씨)
================================================================
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String s = text.getText();
TextFilter filter = Lookup.getDefault().lookup(TextFilter.class);
if (filter != null) {
content.add(s);
s = filter.process(s);
}
text.setText(s);
}
================================================================
이번에는 히스토리를 관리하는 모듈을 새로 만듭니다.
역시 모듈 노드에서 마우스 오른쪽 클릭 - 새로 추가
모듈 프로젝트 이름은 History
나머지는 기본 사항대로 - 다음
코드 이름 기본: com.demo.history
나머지는 기본 사항대로 - 마침
이 히스토리 모듈 역시 윈도우 컴포넌트를 만듭니다.
History 모듈에서 마우스 오른쪽 클릭 - 새로 만들기 - 창 (window component ) 선택
기본 설정은 output 나머지 그대로 - 다음
클래스 이름 접두사는 History
패키지는 com.demo.history 를 선택
마침
디자인 편집창이 뜨면 역시 파레트에서 텍스트 영역(TextArea)를 드래그해서 그림처럼 적당히 크기를 조절하고, 거기서 마우스 오른쪽을 클릭하여 변수 이름을 변경합니다.
새 변수 이름은 historyText - OK
이제 HistoryTopComponent 클래스의 생성자 부분에 다음 코드를 추가합니다.(굵은 글씨 참고)
===================================================================
private Lookup.Result result;

private HistoryTopComponent() {

...

result = org.openide.util.Utilities.actionsGlobalContext().lookupResult(String.class);
result.addLookupListener(new LookupListener() {
public void resultChanged(LookupEvent e) {
historyText.setText(result.allInstances().toString());
}
});

}
===================================================================
임포트 문제는 fix import (가져오기 고정)로
소스 코드 확인
이제 프로젝트(WordApp)를 실행합니다.
아까와 마찬가지로 창을 누르면 이번에는 History 창이 추가 작업되어 있음을 알 수 있습니다. 클릭
히스토리 창은 말그래도 작업한 내용에 대한 히스토리가 나타나는 창입니다.
아래 filter 된 내용이 순서대로, hello, netbeans 6.9 cool 이렇게 2개 작업했고 그 내용이 히스토리 창에 나타나 있습니다

********************************************************************************
그럼 이제 넷빈 6.9에 새로 추가된 내용인 브랜딩(branding)에 대해 알아 보겠습니다.
프로젝트 WordApp 에서 마우스 오른쪽 클릭 - 브랜딩(branding) 클릭
해당 모듈 어플리케이션에 대한 브랜딩 작업으로 제목이나 아이콘 등을 작업하는 기본 화면,
어플리케이션이 시작되기 전에 표시되는 스플래시 스크린 등 기타 여러 내용이 보다 손쉽게 작업되도록 구성되어 있습니다.
기본으로는 넷빈 아이콘이 사이즈 별로 제시되어 있는데 적당히 인터넷에서 해당 사이즈의 아이콘 등을 찾아 연결해 줬습니다. ^^;
두번째 탭은 스플래시 화면에서는 현재 맥 OS 10인 스노우 레오퍼드 이미지를..ㅋㅋ 원래는 역시 넷빈 6.9 이미지가 되어 있습니다. 원하는 이미지를 찾아보기 버튼을 눌러 바꿔주시면 됩니다.
윈도우 시스템 탭의 내용입니다
자원 번들 탭의 내용입니다. 확인 후 - OK
이제 새로 브랜딩 된 내용을 반영하기 위해 프로젝트를 모두 지우고 빌드(clean and build) 합니다
그리고 이 브랜딩 된 내용의 프로젝트를 .exe 로 만들기 위해 WordApp 프로젝트에서 마우스 오른쪽 클릭 - 빌드 인스톨러(build installer)를 선택합니다.
출력창으로 모든 작업이 완료되면(build successfully) 파일 탭을 열고 dist 를 확장하면 안에 프로젝트의 설치 exe 프로그램이 들어 있습니다.
이제 윈도우 탐색기를 열어 좀전의 해당 XXX.exe 를 더블클릭하면 아래 그림처럼 설치 마법사가 시작됩니다. - Next
설치될 경로 확인하고 next
설치 시작 - install
성공적으로 설치가 완료되었습니다. finish
바탕화면에 새로이 WordApp 단축키가 만들어집니다. 더블 클릭하면 아까 설정한 스플래시 화면(아래 그림)과 함께 프로그램이 시작됩니다.
역시 브랜딩에서 작업했던 아이콘(구글 안드로이드 보이)이 프로그램 화면 왼쪽 상단에 그리고 , 작업표시줄에도 나타납니다. 내용은 아까 실행해서 본 대로 윈도우에 histroy, text 등을 선택하여 테스트 해볼 수 있습니다.
Help의 about 을 클릭하면 아래처럼 스플래시 화면과 함께 정보 내용이 표시됩니다. 음..눈표범..이뽀요..ㅎㅎ

이상이 2번째로 만들어본 넷빈즈 플랫폼 프로그램입니다.
특히나 플러그인 생성 및 인스톨러의 강화는 앞으로 이쪽을 활성화할수 있는 좋은 기능들 인 거 같습니다. 넷빈에도 드뎌 돈되는 플러그인이??? 쿄쿄쿄
다음엔 OSGi 번들 및 메이븐과의 작업등도 천천히 함 살펴 보겠습니다.
긴 글에 수고하셨습니다. *^^*

If you enjoyed this post Subscribe to our feed


No Comment

댓글 쓰기