SWT는 위지트(widget)로 그래픽을 그리고 이미지를 표시할 수 있는 그래픽 엔진을 제공합니다. 위지트(widget)에서 아이콘, 텍스트 및 기타 데이터 그리기를 대신 처리해주기 때문에 그래픽 인터페이스를 프로그래밍하지 않고도 많은 것을 처리할 수 있습니다. 그러나, 응용프로그램에서 사용자 정의 그래픽을 표시하거나 사용자 정의 작성 위지트(widget)를 구현할 경우 SWT의 기본 그리기 오브젝트를 일부 이해해야 합니다.
그래픽 컨텍스트 GC는 SWT 그래픽 지원의 초점입니다. 해당 API에서 SWT의 모든 그리기 기능을 설명합니다.
제어에 그리거나(가장 일반적인 경우) 이미지, 표시 또는 프린터 그리기에 GC를 사용할 수 있습니다. 제어에 그릴 경우 사용자에게 제공된 제어의 페인트 이벤트에서 GC를 사용합니다. 이미지, 표시 또는 프린터에 그릴 때 이에 대해 구성된 GC를 작성하고, 모두 사용한 경우 GC를 제거해야 합니다.
GC를 가져왔으면 GC로 그린 그래픽의 모양을 제어하는 속성(예: 색상, 선 너비, 글꼴 등)을 설정할 수 있습니다.
GC에 대한 API 참조서에서 그래픽 기능의 전체 세트를 설명합니다.
SWT의 글꼴을 처리할 때 Font 및 FontData 클래스를 사용합니다.
FontData에서는 글꼴의 특성을 설명합니다. 글꼴 이름, 스타일, 크기를 지정하여 FontData를 작성할 수 있습니다. FontData에는 이러한 속성을 조회하기 위한 API가 포함됩니다. FontData에서 OS 자원을 할당하지 않기 때문에 이를 처리할 필요는 없습니다.
Font는 그리기 API에서 사용된 글꼴을 나타내는 실제 그래픽 오브젝트입니다. 원하는 글꼴의 Display 및 FontData를 지정하여 Display의 Font를 작성합니다. 해당 FontData의 Font를 조회할 수도 있습니다.
사용이 끝났으면 할당된 Font를 처리해야 합니다.
색상은 글꼴과 유사합니다. 원하는 색상의 RGB 값을 지정하여 Display에 대한 Color를 작성합니다. 사용이 끝났으면 색상을 삭제해야 합니다.
Display 메소드 getSystemColor(int)
를 사용하면 OS 플랫폼의 미리 정의된 시스템
색상을 조회할 수 있습니다. 이 방법을 사용하여 가져온 색상을 삭제하지 마십시오.
색상 모델은 SWT 색상 모델 항목에서 자세히 설명합니다.
SWT에서 이미지를 처리할 때 Image, ImageData 및 ImageLoader 클래스를 사용합니다.
ImageData는 사용된 색상 값을 설명하는 PaletteData 클래스를 사용하여 이미지의 실제 픽셀을 나타냅니다. ImageData는 장치 및 플랫폼에 독립적인 이미지 설명입니다.
ImageLoader는 ImageData를 다른 파일 형식으로 로드하여 저장합니다. SWT는 현재 BMP(Windows 비트맵), ICO(Windows 아이콘), JPEG, GIF 및 PNG를 포함하는 이미지 형식의 로드 및 저장을 지원합니다.
Image는 그리기 API에 사용된 이미지를 나타내는 실제 그래픽 오브젝트입니다. 특정 Display에 대한 이미지를 작성하십시오. 다음과 같은 여러 가지 방법으로 이미지를 만들 수 있습니다.
Image를 작성하는 방법과는 상관 없이 이를 처리해야 합니다.
SWT에서 그리기에 사용한 대부분의 그래픽 오브젝트는 기본 OS에 자원을 할당하고 명시적으로 삭제해야 합니다. 이전에 설명한 동일한 대체적인 규칙이 여기에 적용됩니다. 생성자를 사용하여 만든 경우 이를 삭제해야 합니다. 다른 곳에서 액세스할 경우에는 삭제하지 마십시오.
그래픽 컨텍스트, 글꼴, 색상 및 이미지 등과 같은 그래픽 오브젝트는 만들자마자 OS에 할당됩니다. 그래픽 오브젝트 사용을 위한 계획 방법에 따라 그래픽 오브젝트를 작성하는 시기가 결정됩니다.
응용프로그램에서 많이 사용하는 그래픽 오브젝트의 경우 위지트(widget)를 만들 때 그래픽 오브젝트를 작성할 수 있습니다. 색상과 글꼴의 경우에는 주로 이와 같은 방법을 사용합니다. 다른 경우에는 진행 중에 그래픽 오브젝트를 만드는 것이 더 적당합니다. 예를 들어, 위지트(widget) 이벤트 핸들러 중 하나로 그래픽 컨텍스트를 작성하여 일부 계산을 수행할 수 있습니다.
사용자 정의 위지트(widget)를 구현할 경우 그래픽 오브젝트를 항상 사용한다면 일반적으로 생성자에 그래픽 오브젝트를 할당하십시오. 그래픽 오브젝트를 항상 사용하지 않거나 그래픽 오브젝트가 일부 속성의 상태에 따라 달라질 경우 신속히 할당할 수 있습니다.
그래픽 오브젝트를 할당했으면 이제 페인트할 준비가 되었습니다. 항상 페인트 리스너 안에 페인트하십시오. 다른 이벤트에 응답하면서 페인트할 경우는 거의 없습니다. 특히 사용자 정의 위지트(widget)를 구현할 경우에는 더욱 그렇습니다. 그러나, 일반적으로 이 방법은 권장되지 않습니다. 다른 이벤트를 처리하는 중에 페인트를 해야할 경우 OS에 다른 페인트 이벤트를 만드는 redraw 메소드를 먼저 사용해보십시오. 페인트 메소드 외부에서 그릴 경우 플랫폼 최적화가 실패하고 이벤트 대기열의 보류 중인 페인트 개수에 따라 버그가 생길 수도 있습니다.
페인트 이벤트를 수신하면 위지트(widget)에 그리기 위해 미리 구성한 GC가 제공됩니다. 이 GC를 삭제하지 마십시오! 이 GC를 만들지 않았습니다.
이벤트를 처리하는 중이나 그 전에 다른 그래픽 오브젝트를 할당해야 합니다. 다음은 org.eclipse.swt.examples.HelloWorld5 샘플을 기준으로 이전에 위지트(widget)를 작성할 때 빨간 색상을 할당했기 때문에 여기서 사용할 수 있습니다.
shell.addPaintListener(new PaintListener () { public void paintControl(PaintEvent event){ GC gc = event.gc; gc.setForeground(red); Rectangle rect = event.widget.getClientArea(); gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20); gc.drawString(resHello.getString("Hello_world"), rect.x + 20, rect.y + 20); } });
할당했던 모든 그래프 오브젝트는 사용을 마쳤으면 삭제해야 합니다.
오브젝트를 만든 시점에 따라 삭제 시기도 달라집니다. 위지트(widget)를 만들면서 그래픽 오브젝트를 만든 경우 일반적으로 위지트(widget)에 삭제 리스너를 추가하고, 위지트(widget)를 삭제한 경우 그래픽을 삭제합니다. 페인트하면서 오브젝트를 만든 경우 페인트가 끝나면 오브젝트를 삭제해야 합니다.
다음 코드 스니펫에서는 약간 수정된 버전의 페인트 리스너를 보여줍니다. 이 예에서는 페인트하면서 색상을 할당 및 삭제합니다.
shell.addPaintListener(new PaintListener () { public void paintControl(PaintEvent event){ GC gc = event.gc; Color red = new Color(event.widget.getDisplay(), 0xFF, 0, 0); gc.setForeground(red); Rectangle rect = event.widget.getClientArea(); gc.drawRectangle(rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20); gc.drawString(resHello.getString("Hello_world"), rect.x + 20, rect.y + 20); red.dispose(); } });