2014년 9월 18일 목요일

JavaFX UI - 19.Titled Pane & Accordion


Titled Pane은 타이틀을 가진 panel이다. 이 panel은 열리거나 닫힐 수 있으며, UI 컨트롤 또는 이미지, 레이아웃 컨테이너에 추가된 엘리먼트 그룹 등과 같은 모든 형태의 Node들을 포함할 수 있다.

Titled Pane은 accordion 컨트롤을 이용하여 그룹화될 수 있다. Accordion 컨트롤은 여러 panel들을 생성하고 한번에 하나의 panel 만 보여주고자 할 때 사용된다.

아래 화면은 세 개의 titled pane을 묶은 accordion 컨트롤을 보여준다.

1. Creating Titled Panes

TitledPane 컨트롤을 생성하기 위해 타이틀과 내용을 정의한다. 이를 위해 TitledPane 클래스의 생성자를 사용하거나, setTextsetContent 메서드를 사용할 수 있다.

Example 19-1 Declaring a TitledPane Object

 
위 코드 샘플을 통해 보여지는 Titled pane의 모습은 아래와 같다.



Titled Pane의 크기는 내부 컨텐트의 preferred size를 수용하기 위하여 재조정된다. Titled Pane의 컨텐트로써 멀티 라인 텍스트가 지정될 수 있다.



Titled Pane의 크기를 명시적으로 지정하지 않도록 한다. Titled pane이 열리거나 닫힐 때 비정상적인 상황을 유발할 수 있다.
아래 예제 코드는 GridPane 레이아웃 컨테이너를 이용하여 titled pane의 컨텐트를 구성하는 코드이다.

Example 19-2 Titled Pane with the GridPane Layout Container


위 코드를 통해 생성된 titled pane의 모습은 아래와 같다.



디폴트로 모든 titled pane은 접힐 수 있고, 접히거나 열리는 움직임에 애니메이션 효과가 적용된다. 만약 titled pane이 접히는 것을 막고자 한다면 setCollapsible(false) 메서드를 사용한다. 또한 setAnimated(false) 메서드를 통해 애니케이션 효과도 없앨 수 있다.

Example 19-3 Adjusting the Style of a Titled Pane



2. Adding Titled Panes to an Accordion

Titled pane은 독립적으로 사용될 수도 있고, Accordion 컨트롤을 통해 그룹화되어 사용될 수도 있다.

여러 titled pane들을 하나의 accordion에 추가하는 것은 toggle 버튼들을 하나의 toggle group에 추가하는 것과 유사하다. Accordion에서는 여러 titled pane이 동시에 열릴 수 없으며, 한번에 오직 하나의 titled pane 만이 열릴 것이다.

Example 19-4 Accordion and Three Titled Panes



Accordion에 추가된 모든 titled pane들은 초기 디폴트 설정으로 인해 접혀있다. 특정 titled pane을 열려 있도록 하려면 setExpandedPane 메서드를 사용한다.




3. Processing Events for an Accordion with Titled Panes

아래 예제는 두 가지 형태의 titled pane을 생성한다. 하나는 email client UI를 가지는 독립 titled pane이고, 다른 하나는 서로 다른 이미지들을 컨텐트로 가지는 세 개의 titled pane과 이를 accordion을 통해 그룹화하였다. Accordion을 통해 선택된 titled pane의 이미지가 email client UI 상의 이미지 첨부로 설정된다.

Example 19-5 Implementing ChangeListener for an Accordion





아래 화면은 위 예제가 실행된 초기 화면이다. 아직 accordion 상에서 이미지가 선택되지 않았으므로 첨부파일 지정이 “N/A”로 표시된다.



 
사용자가 accordion에서 titled pane을 선택한다면 아래와 같이 보일 것이다.


JavaFX UI - 18.Tooltip


Tooltip 클래스는 다른 UI 컨트롤에 대한 부가 정보를 표시하기 위해 일반적으로 사용되는 UI 컴포넌트이다. 툴팁은 setTooltip 메서드를 통해 다른 컨트롤 상에 지정될 수 있다.

툴팁은 두 가지의 서로 다른 상태를 가진다. : activated, showing

마우스가 해당 컨트롤 상에서 움직일 때, 툴팁이 활성화된다. 그리고 실제로 툴팁이 보여지면 showing 상태가 된다. 화면에 보여진 툴팁 또한 활성화된 상태이다. 일반적으로 툴팁이 활성화되는 때와 실제로 보여지는 때 사이에는 약간의 시간 지연이 있다.

아래 화면은 password field에 툴팁을 설정한 화면이다.



1. Creating a Tooltip

위 화면과 같이 툴팁을 가진 password field를 생성하는 샘플 코드는 아래와 같다.

Example 18-1 Adding a Tooltip to the Password Field



Javafx.scene.control 패키지에 정의된 각 UI 컨트롤들은 툴팁은 설정하기 위한 setTooltip 메서드를 가진다.
Tooltip 클래스는 Labeled 클래스를 상속하였으므로, 텍스트 뿐만 아니라 그래픽 아이콘까지 지정할 수 있다.

아래 예제는 툴팁에 그래픽 아이콘을 추가하는 샘플 코드이다.

Example 18-2 Adding an Icon to a Tooltip



코드가 적용되면 아래와 같은 모습의 툴팁을 설정할 수 있다.



2. Presenting Application Data in Tooltips

아래 화면은 호텔숙박 총액을 계산하기 위하여 사용자가 툴팁에 디스플레이되는 정보를 활용할 수 있도록 구현한 어플리케이션 화면이다.



각 체크박스에는 툴팁이 설정되어 있으며, 이 툴팁들은 각 예약 옵션에 대한 비용을 표시하고 있다. 만약 사용자가 체크박스를 선택한다면, 그에 해당하는 비용이 총액에 더해질 것이다. 반대로 체크박스의 선택이 해제되면 총액에서 해당 비용이 차감된다.
아래 예제는 위 어플리케이션에 대한 소스 코드이다.

Example 18-3 Using Tooltips to Calculate Hotel Rates


2014년 9월 17일 수요일

Do you know BigTIFF?

얼마전 GeoNURIS Desktop을 사용하여 시스템을 구축 중에 있는 사용자로부터 tiff 파일을 읽는데 오류가 발생한다는 내용과 함께 해당 tiff 파일(약 4.68G)을 받았다.

지금까지 tiff 파일을 읽는데 문제가 발생한 적이 없었기에 파일이 온전치(?) 못하거나 사용자 조작 미숙일거라 판단하고, 바로 디버깅에 돌입하였다.
그러나 디버깅을 시작한지 얼마 안되어 곧바로 밀려오는 멘붕.... 이건 뭐지??

소스 없이 JAI (Java Advanced Image) 모듈을 디버깅하는데.. 도통 알 수 없는 코드 블럭을 종횡무진하면서 파일로부터 데이터를 읽어대는데... 30분이 넘도록 그러고 계신다...

예전부터 tiff 포맷이 궁금했으나.. 궂이 내가 그걸 들여다 볼 필요가 있겠냐는 생각으로 손대지 않았지만, 갑자기 승부욕이 불타올라 tiff 규격을 해부하면서 원인 파악에 나섰다.

별의 별 상상력을 다 동원해가며 문제 원인을 예상하고, 그 문제가 맞는지 테스트해 보는 과정을 별다른 진전 없이 반복하기를 사흘째... 초조.. 낙담..

Tiff 헤더에서 읽힌 버전 넘버에 별 신경을 안 쓰다가... 가만히 보니 42 (고정값)가 아니라 43 인거다.
JAI에서 버전 넘버가 이상하다는 것을 알려주기만 했어도 쉽게 갈 수 있었는데.... ㅜㅜ

버전 넘버 43을 구글링하다가 발견한 것이 BigTIFF !

Adobe 사의 Steve Carlsen에 의해 제안된 규격으로 아직 정식 규격으로 채택된거 같진 않아 보인다. BigTIFF 규격은 64bit OS에 의해 지원되는 파일 사이즈가 커짐에 따라, 4G 이상의 tiff 파일을 지원하기 위하여 제안된 규격으로써 JAI에서도 아직 지원하지 않고 있는 규격이다.

tiff 파일의 내부 구조는 굉장히 가변적이고 확장적이며, 이를 위해 tagging된 데이터 블럭들이 서로를 참조하고 있다.
기존의 tiff 규격에서는 데이터블럭의 오프셋을 나타내기 위하여 4byte unsigned int를 사용하는데, 4G 이상의 큰 파일 상에서의 오프셋을 지정하기에는 부족하였다.

BigTIFF에서는 8byte unsigned long 값을 사용하여 오프셋을 표현하도록 되어 있으며, 이 밖에 데이터타입의 추가확장을 포함한 전반적인 규격 변경이 이루어졌다.


결국 BigTIFF를 읽을 수 있도록 JAI 코드를 확장하여, GeoNURIS Desktop에 반영하였더니, 드디어 문제의 tiff 파일이 열렸다.  그 순간 소름이 확 돋았다는 ... ㅋ
심지어 ArcMap이나 QGIS와 비교하여 속도가 더 빠르다는 사실에 뿌듯~~

앞으로 BigTIFF를 읽을 때도 GeoNURIS Desktop에서~~  (^^) v


혹시나 비슷한 문제로 헤딩(?)하시는 분들이 있을까 해서 정보 공유합니다.
 BigTIFF 관련 내용은 아래 링크를 참고하세요~
BigTIFF File Format Proposal

2014년 9월 16일 화요일

JavaFX UI - 17.HTML Editor


HTMLEditor 컨트롤은 풍부한 기능을 갖춘 텍스트 편집기이다. HTML5 문서 편집이 가능하고, 다음과 같은 편집 기능들을 포함한다.

  • 텍스트 포맷팅 : bold, italic, underline, strike
  • Paragraph setting : format, font family, font size
  • 포그라운드 및 백그라운드 색상
  • Text indent (들여쓰기)
  • Bulleted and numbered lists
  • 텍스트 정렬
  • Adding a horizontal rule
  • 복사/붙여넣기

아래 화면은 JavaFX 어플리케이션에 텍스트 편집기가 추가된 모습이다.



1. Adding and HTML Editor

HTMLEditor
컨트롤은 아래 예제에서와 같이 직접 scene에 추가될 수도 있고, 별도의 레이아웃 컨테이너를 통해 추가될 수도 있다.

Example 17-1 Adding an HTML Editor to a JavaFX Application



위 예제를 실행하면 아래와 같은 어플리케이션이 나타난다.


텍스트 포맷팅을 위한 툴바는 기본 구현에서 제공되는 것으로써, 이를 숨길 수는 없다. 그러나 CSS 스타일을 통해 편집기 모습을 변경할 수 있다.

Example 17-2 Styling the HTMLEditor



위와 같은 스타일을 Example 17-1에 적용하면 아래와 같은 모습으로 바뀐다.



위에서 적용된 스타일은 컴포넌트 border와 툴바의 폰트가 변경되었다.

HTMLEditor 클래스는 어플리케이션이 시작될 때 편집 영역에 나타날 컨텐츠를 설정하기 위해 setHtmlText 메서드를 제공한다.

Example 17-3 Setting the Text Content



위 예제를 실행하면 아래와 같은 모습이다.



2. Using an HTML Editor to Build the User Interface

HTMLEditor
컨트롤을 이용하여 인스턴트 메신저 서비스, 이메일 클라이언트 심지어는 CMS (content management system) 까지도 구현할 수 있다.

아래 예제는 이메일 클라이언트에서 흔히 볼 수 있는 UI를 구성한 것이다.

Example 17-4 HTMLEditor Added to the Email Client UI





위 예제를 실행한 화면은 아래와 같다.



setPrefWidthsetPrefHeight 메서드를 통해 HTMLEditor의 너비와 높이를 지정할 수 있다. 위 예제에서는 높이만 지정하고 너비는 따로 지정하지 않았다. 이 때 너비는 HTMLEditor의 컨테이너인 VBox 컨테이너에 의해 정해진다. 텍스트 컨텐츠가 정해진 편집 영역의 높이를 넘어가면 수직 스크롤바가 나타날 것이다.


3. Obtaining HTML Content

HTMLEditor
컨트롤의 텍스트를 편집하거나 초기 컨텐츠를 지정하는 것 이외에, 입력된 텍스트를 HTML 형식으로 얻어올 수 있다.

다음 예제는 이러한 작업을 구현한 것이다.

Example 17-5 Retrieving HTML Code



 
 
HTMLEditor 클래스의 getHTMLText 메서드는 현재 입력된 텍스트 컨텐츠를 HTML 문자열 형식으로 반환한다. 위 예제에서는 이러한 HTML 컨텐츠를 별도의 TextArea에 표시해준다.
 




위 예제를 확장하여, HTMLEditor의 컨텐츠를 파일로 저장한 후, 이를 WebView 컨트롤에서 로딩할 수 있다. 아래 예제는 이를 구현한 코드이다.


Example 17-6 Rendering Edited HTML Content in a Browser




위 예제를 실행한 모습은 아래와 같다.


JavaFX UI - 16.Hyperlink


Hyperlink 클래스는 Labeled 컨트롤의 또 한 가지 유형이다.

기본 hyperlink 구현에서는 아래와 같은 세 가지의 상태를 가진다.



1. Creating a Hyperlink

다음
예제 코드는 hyperlink를 생성하는 예시이다.

Example 16-1 Typical Hyperlink



Hyperlink 클래스의 setText 메서드는 하이퍼링크의 텍스트를 지정한다. Hyperlink 클래스는 Labeled 클래스를 상속받았으므로 하이퍼링크 텍스트의 폰트나 색상을 따로 지정할 수 있다. setOnAction 메서드는 하이퍼링크가 클릭되었을 때 취할 액션을 지정할 수 있다.


2. Linking the Local Content

아래
화면은 하이퍼링크를 통해 로컬 디렉토리로부터의 이미지를 화면에 그리는 샘플 어플리케이션이다.
 




다음 예제는 위 어플리케이션에 대한 소스 코드이다.

Example 16-2 Using Hyperlinks to View Images





사용자가 하이퍼링크를 클릭하면 하이퍼링크의 상태가 visited 상태로 변한다. Hyperlink 클래스의 setVisited 메서드를 사용하여 하이퍼링크의 상태를 변경할 수 있다. 위 예제에서 ‘Refresh links’ 버튼을 클릭하면 모든 하이퍼링크의 상태가 unvisited 상태로 바뀔 것이다.


3. Linking the Remote Content

WebView
브라우저 컨트롤을 사용하면, JavaFX 어플리케이션에서 HTML 컨텐트를 디스플레이할 수 있다. WebView 컨트롤은 기본 웹 페이지 브라우징 기능을 제공한다. 즉, 웹페이지를 보여주고 link를 통한 페이지 이동과 java script 실행 등과 같은 사용자 상호작용을 지원한다.

다음 예제는 이미지와 텍스트를 모두 가진 Hyperlink 컨트롤을 이용하여, 원격 웹 페이지들을 보여주는 어플리케이션 소스 코드이다.

Example 16-3 Loading Remote Web Pages




 

위 코드를 실행하면 아래와 같은 어플리케이션 모습을 볼 수 있다.
 

JavaFX UI - 15.Progress Bar & Progress Indicator


ProgressIndicator 클래스와 ProgressIndicator의 서브 클래스인 ProgressBar 클래스는 작업이 진행 중임을 표현하기 위한 컨트롤로써, 현재 작업이 얼마만큼 진행되었는지를 알려준다.

ProgressBar는 막대 형태로 표현되는데 반해, ProgressIndicator 클래스는 파이 차트 형태로 보여진다.




1. Creating Progress Controls

아래
와 같은 코드를 통해 progress 컨트롤을 생성할 수 있다.

Example 15-1 Implementing the Progress Bar and Progress Indicator



작업이 끝나는 시점을 판별하기 어려운 상황이 종종 있는데, 이를 위해 progress 컨트롤을 indeterminate 모드로 만들 수 있다.

아래 화면은 상황에 따른 progress 컨트롤의 모습을 보여준다.



아래 예제는 위 화면에서 보여지는 어플리케이션에 대한 소스 코드이다.


Example 15-2 Enabling Different States of Progress Controls



0에서 1 사이의 progress 값은 진행률을 나타낸다. 예를 들어 0.4는 40%의 진행률을 의미한다. Progress 값이 음수이면 progress 컨트롤이 indeterminate 모드에 있음을 의미한다. Progress 컨트롤이 indeterminate 모드에 있는지를 체크하기 위햐여 isIndeterminate 메서드를 사용할 수 있다.


2. Indicating Progress in Your User Interface

아래
예제는 슬라이더의 값에 따라 progress 컨트롤들의 값을 조정하는 어플리케이션의 소스 코드이다.

Example 15-3 Receiving the Progress Value from a Slider




위 예제를 실행하면 아래와 같은 화면이 나타난다.