IListItemRenderer   article search result : 1

DataGrid 아이템 렌더러 구현하기

문제점 : Sprite를 데이터그리드의 아이템렌더러로 적용하려고 하니 적용이 안된다.

해결책 : Sprite를 addChild하는 IUIComponent 타입의 래퍼클래스를 생성해, 필요한 인터페이스를 구현하고 로직을 추가한다. 결론부터 말하자면, Sprite는 데이터그리드의 아이템렌더러로 사용할 수 없다. 왜? 흠... 사실 이 말은 틀린 말이다. Sprite도 데이터그리드의 아이템렌더러로 사용할 수 있다. 하지만 그 과정에 많은 노고가 따른다. 데이터그리드는 아이템렌더러를 적용하는 과정에서, 아이템렌더러로 지정된 클래스의 인스턴스를 IListItemRenderer 타입으로 캐스팅하고 있다. 다음은 DataGridColumn.as의 일부분이다. 그런데 IListItemRenderer 인터페이스는 바로 IUIComponent 인터페이스를 상속하고 있다. IUIComponent 인터페이스에는 수 많은 setter/getter 메소드들이 정의되어 있는데, 이들 메소드를 모두 구현하는 것보다 그냥 우리가 잘 아는 UIComponent 클래스를 사용하는 편이 좋다! 따라서, Sprite가 IUIComponent 인터페이스를 시작으로 IListItemRenderer 등의 인터페이스를 차례대로 구현할 수는 있지만, 굳이 이렇게 할 필요가 없다. 그냥 UIComponent 클래스를 상속해 필요한 인터페이스만 몇 가지 구현하면 되기 때문이다. 아래 코드는 이렇게 구현한 ImageRenderer 라는 클래스이다. 이 클래스는 UIComponent 클래스를 상속하고 있기 때문에, 다시 IUIComponent 인터페이스를 구현할 필요가 없다. 이 클래스가 구현하고 있는 인터페이스는 단 두 가지뿐인데, UIComponent를 확장해 데이터그리드나 다른 리스트 기반의 클래스에 아이템렌더러로 적용할 때는, 항상 이런 식의 패턴을 따라야 한다. 물론, UIComponent를 자주 써서 여러 형태의 데이터그리드 아이템 렌더러를 만드는 개발자라면, 인터페이스 구현 부분만 따로 떼어서 별도의 커스텀 클래스를 만들 수도 있을 것이다. IListItemRenderer 인터페이스는 다른 여러 인터페이스를 상속하는 인터페이스이다. 이 인터페이스는 특별히 IDataRenderer 인터페이스를 상속하고 있는데, 이 인터페이스가 바로 data 속성의 setter/getter 메소드를 정의하고 있는 인터페이스이다. 따라서 IListItemRenderer 인터페이스를 구현한다고 클래스 선언부에서 정의를 했으면, 항상 data 속성을 선언하고 setter/getter 메소드를 정의해야 한다. 다음으로 IDropInListItemRenderer 인터페이스라는 것이 있는데, 이 인터페이스는 List 컴포넌트에는 별로 필요없고, 데이터그리드같이 컬럼이 여러개인 List 기반의 컴포넌트에서 컬럼을 동적으로 알아오기 위해 구현해 주어야 한다. 구현하는 방법은 아래와 같다. IDropInListItemRenderer 인터페이스를 구현하면, 동적으로 아이템렌더러가 사용된 컬럼의 이름을 알 수 있다. 알아오는 방법은 다음과 같다. 이런 내용들을 염두에 두고 다시 ImageRenderer라는 클래스를 살펴 보도록 하자. 다음은 어플리케이션에서 이 아이템렌더를 사용한 예이다.

이 애플리케이션에서는 A 필드로 "Fx.jpg" (아래 이미지 파일 참고. 이 클래스는 설명 용도로 특수 제작되었기 때문에, 확장성을 충분히 고려하지 않았다) 라는 이미지의 경로가 들어온다. 이 경로는 데이터필드를 동적으로 알아오는 ImageRenderer 클래스에 의해 ImageLoader 인스턴스로 전달되고, ImageLoader 인스턴스는 경로 문자열을 받아서 source로 설정해 이미지를 불러온다.

ActionScript 원리
: 데이터그리드 아이템렌더러로는 물론 여러 built-in 컴포넌트 (Label, TextInput, CheckBox 등)를 사용할 수 있다. 하지만, 이처럼 UIComponent 클래스부터 시작해 필요한 인터페이스를 하나씩 구현해 보면 아이템렌더러의 원리를 이해하는 데 보다 도움이 된다. 또 Container 클래스를 사용하지 않고도 UIComponent의 updateDisplayList() 메소드를 오버라이드함으로써 레이아웃 로직을 최소한의 비용으로 처리하는 것도 물론 가능하다.
사용자 삽입 이미지
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/10/01 13:39 2008/10/01 13:39
REPLY AND TRACKBACK RSS http://joshy21.com/weblog/rss/response/5
REPLY AND TRACKBACK ATOM http://joshy21.com/weblog/atom/response/5
TRACKBACK ADDRESS
http://joshy21.com/weblog/trackback/5
REPLY RSS http://joshy21.com/weblog/rss/comment/5
REPLY ATOM http://joshy21.com/weblog/atom/comment/5
[로그인][오픈아이디란?]
이름 :
비밀번호 :
홈사이트 :
비밀글 :
*1 
count total 10266, today 15, yesterday 16
관리인 : eirene
rss
I am
전체
Development
La vie quotidienne
English
Languages
Jesus
글 보관함
2010/01, 2009/06, 2009/03, 2009/02, 2009/01,
달력
«   2010/03   »
  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