2007.11.20 15:56
다음의 포스팅은 Peter Ent 블로그Coloring the Background of Cells 포스트의 검쉰 맘대로 해석판입니다.
말이 안되게 타이프 해놓은 것도 있으니(ㅡㅡ;) 그러려니... 하여 주세요 ;)

아래의 결과물은 해당 포스트의 소스를 빌드하여 올려보았습니다.

")//]]>


위의 예제는 총 5개로 되어 있습니다만, 4개만 설명 합니다.
1. 아이템렌더러(itemRenderer)를 이용하여 특정컬럼의 배경색을 바꾸기 (itemRenderer Tab)
2. 컬럼에 직접 배경색을 지정하기 (backgroundColor Tab)
3. drawColumnBackground function을 재정의하여 배경색에 alpha 값을 주기 (backgroundAlpha Tab)
4. drawRowBackground function을 재정의하여 row에 배경색을 주기 (Custom Row Background Tab)



1. 아이템 렌더러(itemRenderer)를 이용하여 특정 컬럼의 배경색을 바꾸기 
   (itemRenderer Tab 참고)
사용자 삽입 이미지

특정 Cell의 배경색을 바꾸려면 아이템렌더러(itemRenderer)가 필요합니다.
아이템렌더러(itemRenderer)는 데이터그리드(Datagrid)의 전체에 적용하거나 특정 컬럼에 적용이 가능합니다만,
아래의 아이템렌더러(itemRenderer) 예제에는 Year 컬럼에만 적용하도록 하겠습니다.

간단하게 Label을 상속받아 updateDisplayList function을 재정의 하여서
Year의 값을 판단(Year의 값이 2000년 이전이면 파란색, 2000년 이후이면 녹색) 하여
Label에 파란색 또는 녹색의 사각형을 그려 배경색을 나타내고 있습니다.

<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    <![CDATA[

      import flash.geom.Matrix;
      import flash.display.GradientType;
      import flash.display.Graphics;

      override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
      {
        super.updateDisplayList(unscaledWidth,unscaledHeight);

        var m:Matrix = new Matrix();
        m.createGradientBox(unscaledWidth,unscaledHeight);

        var g:Graphics = graphics;
        var colors:Array = (data.col3 < 2000 ? [0x0000CC,0x0000FF] : [0x00CC00,0x00FF00]);

        g.clear();
        g.beginGradientFill(GradientType.LINEAR, colors, [0.2,0.6], [0,255], m);
        g.drawRect(0, -2, unscaledWidth, unscaledHeight+4 );
        g.endFill();
      }
    ]]>
  </mx:Script>
</mx:Label>

아래는 AS Class 로 동일하게 만들어본 아이템 렌더러입니다.
package
{
  import flash.geom.Matrix;
  import flash.display.GradientType;
  import flash.display.Graphics;
  import mx.controls.Label;

  public class ColoredBackgroundItemRenderer extends Label
  {
    public function ColoredBackgroundItemRenderer()
    {
      super();
    }

    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
    {
      super.updateDisplayList(unscaledWidth,unscaledHeight);

      var m:Matrix = new Matrix();
      m.createGradientBox(unscaledWidth,unscaledHeight);

      var g:Graphics = graphics;
      var colors:Array = (data.col3 < 2000 ? [0x0000CC,0x0000FF] : [0x00CC00,0x00FF00]);

      g.clear();
      g.beginGradientFill(GradientType.LINEAR, colors, [0.2,0.6], [0,255], m);
      g.drawRect(0, -2, unscaledWidth, unscaledHeight+4 );
      g.endFill();
    }
  }
}



2. 컬럼에 직접 배경색을 지정하기
   (backgroundColor Tab 참고)


사용자 삽입 이미지


단지 컬럼의 모든 Cell에 배경색을 지정하고 싶은 것이라면 아이템 렌더러를 만들 필요는 없습니다.
아래와 같이 데이터그리드(Datagrid) 컬럼에 있는 backgroundColor 속성을 이용하면 쉽게 가능합니다.

<mx:DataGridColumn headerText="Make" backgroundColor="0xCC0000" dataField="col1"/>

0xCC0000은  빨강색() 입니다. backgroundColor Tab에서 Make 컬럼에 적용되어 있습니다.
backgroundColor="red" 같은 경우도 가능합니다.



3. drawColumnBackground function을 재정의하여 배경색에 alpha 값을 주기
   (backgroundAlpha Tab 참고)

사용자 삽입 이미지


데이터그리드(Datagrid) 컬럼은 투명도(Alpha)를 주는 속성이 없습니다.
하지만  데이터그리드(Datagrid)에 있는 drawColumnBackground function을 재정의하여 투명도를 줄 수 가 있습니다.
데이터그리드(Datagrid)를 상속받아서 만든 Class에서 아래와 같이 drawColumnBackground function을 재정의 합니다.

override protected function drawColumnBackground(s:Sprite, columnIndex:int, color:uint, column:DataGridColumn):void
{
  super.drawColumnBackground(s,columnIndex,color,column);

  var background:Shape = Shape(s.getChildByName(columnIndex.toString()));
 
  if( background )
  {
    background.alpha = 0.5;
  }
}

하지만 위의 코드에서는 투명도가 0.5로 하드코딩 되어 있으므로 권장할 만한 코드가 안됩니다.
그래서 다음과 같이 Class 내에 투명도를 저장할 변수 columnBackgroundAlpha를 정의합니다.

public var columnBackgroundAlpha:Number = 1;

그리고 재정의한 drawColumnBackground function의 코드를 변수 columnBackgroundAlpha에 의해
투명도를 변경할 수 있도록 다음과 같이 수정합니다.

backgroundAlpha = columnBackgroundAlpha;

외부에서 투명도는 아래와 같이 변경 할 수 있습니다.

<local:ColoredBackgroundDataGrid columnBackgroundAlpha="0.3" ... >



4. drawRowBackground function을 재정의하여 row에 배경색을 주기
   (Custom Row Background Tab 참고)

사용자 삽입 이미지

특정 컬럼이 아닌 한 줄(row)의 배경색을 바꾸려면 데이터그리드(Datagrid)를 상속받은 Class에서
아래와 같이 drawRowBackground function을 재정의 하여 배경색을 바꿀 수 있습니다.

year의 값이 2000년 이전이면 오렌지색, 2000년 이후면 흰색, 값이 없으면 녹색으로 출력하도록 하였습니다.

override protected function drawRowBackground(s:Sprite, rowIndex:int, y:Number, height:Number, color:uint, dataIndex:int):void
{
  var dp:ArrayCollection = dataProvider as ArrayCollection;
  var item:Object;

  if( dataIndex < dp.length ) item = dp.getItemAt(dataIndex);

  if( item != null && item.year < 20000 ) color = 0xFF8800;
  else if( item != null && item.year>= 2000 ) color = 0xFFFFFF;
  else color = 0x00CC00;

  super.drawRowBackground(s,rowIndex,y,height,color,dataIndex);
}

하지만, 위의 코드는 색깔과 기준값들이 하드코딩되어 있어 권장할만한 코드가 못됩니다.
이 때, 배경색으로 쓰일 색을 외부에서 따로 구현할 수 있도록 하여 해결하도록 하겠습니다.

외부의 function을 쓰기 위해 Class에 아래와 같이 속성을 하나 추가하겠습니다.

public var rowColorFunction:Function;

그리고 아래와 같이 color값을 위에서 만든 Function에서 받아올 수 있도록 하여 줍니다.

override protected function drawRowBackground(s:Sprite, rowIndex:int, y:Number, height:Number, color:uint,dataIndex:int):void
{
  if( rowColorFunction != null )
  {
    var dp:ArrayCollection = dataProvider as ArrayCollection;
    var item:Object;
   
    if( dataIndex < dp.length ) item = dp.getItemAt(dataIndex);

    color = rowColorFunction( item, rowIndex, dataIndex, color );
  }
 
  super.drawRowBackground(s,rowIndex,y,height,color,dataIndex);
}

그리고 아래와 같이 rowColorFunction에 외부의 function을 지정하여 주고,

<local:ColoredBackgroundDataGrid rowColorFunction="determineColor" ... >

지정된 determineColor function은 아래와 같이 정의합니다.

private function determineColor( item:Object, rowIndex:int, dataIndex:int, oldColor:uint ) : uint
{
  if( item == null ) return 0x00CC00; // green are empty rows
  if( item.year< 2000 ) return 0xFFCC00;
  else if( item.year >= 2000 ) return 0xFFFFFF;
}

이제 정의 하였던 Class 외부에서 rowColorFunction에 알맞는 function을 정의하여 배경색을 변경 할 수 있게 되었습니다.
신고
Favicon of http://www.dalyong.com/ BlogIcon 달룡이네집 | 2007.11.20 22:35 신고 | PERMALINK | EDIT/DEL | REPLY
컬러를 볼때만해도 신기하고 재미있긴 한데..아래 알파벳을 보면서..머리가 살짝..아파오는군요..눈도 돌아가고..ㅎㅎ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2007.11.21 14:44 신고 | PERMALINK | EDIT/DEL
저도 매번 보지만 친해지지가 않아요 ^^;
Favicon of http://blog.jidolstar.com BlogIcon 지돌스타 | 2007.11.29 11:08 신고 | PERMALINK | EDIT/DEL | REPLY
어제 봤던 거네요~~ Gradient에 관련된 자료 찾다가 우연히 봤었는데....
이미 한글로~~ 멋집니다.
좋은 자료 감사해요
박스농사 | 2008.03.31 19:34 신고 | PERMALINK | EDIT/DEL | REPLY
오른쪽위의 사진은 주최측의 농간입니다.
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.03.31 21:57 신고 | PERMALINK | EDIT/DEL
안놀아줬더니 디게 심심했던 모양이네 ㅋㅋㅋㅋ
박스농사 | 2008.04.02 14:09 신고 | PERMALINK | EDIT/DEL | REPLY
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.04.02 18:25 신고 | PERMALINK | EDIT/DEL
좀 한가해지면 놀아줄께요 ㅋ
영희 | 2008.06.03 14:51 신고 | PERMALINK | EDIT/DEL | REPLY
검쉰님 블로그에는 데이터 그리드에 관한 자료가 많네요^^ 좋은 자료 구경 하고 갑니다~
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.03 16:53 신고 | PERMALINK | EDIT/DEL
전에 찾았던 자료인데, 도움이 많이 될 것 같아서 (허접하게) 번역하여 올렸습니다.
도움이 되셨으면 좋겠네요 ;)
방문 감사합니다.
엠씨 | 2008.09.16 15:43 신고 | PERMALINK | EDIT/DEL | REPLY
좋은자료 감사합니다...
색깔 넣는부분이 필요해서 요기 소스를 참고해서 만들어 봤는데요..
예를 들어 마지막행의 색깔을 바꾸겠다...했을때
그리드의 크기보다 데이터의 양이 많을경우 색깔이 바뀌지 않더라구요....(스크롤바가 생겨서 스크롤링한경우)
그리드를 리사이즈해서 데이터row보다 커질경우엔 색깔이 바뀌고요...
혹시 이문제 접하신적이 있으신지....?
색깔바껴서 좋아하고 있다가 다시 머리를 싸매기 시작했네요..ㅠ.ㅠ;
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2008.09.16 17:03 신고 | PERMALINK | EDIT/DEL
화면에 보이지 않는 부분이라서 그런듯 합니다.
정확하지는 않지만 DataGrid의 컨테이너의 creationPolicy 값을 조정해보세요 ^^;
(아닐 가능성 90%)
박대호 | 2009.11.25 13:46 신고 | PERMALINK | EDIT/DEL | REPLY
안녕하세요 ?

저는 부산의 벤쳐 S/W회사의 대표이사 입니다.
영원님의 깔금하고 잘 정돈된, 정보 덕분에 많은 도움을 받고 있습니다.

저도 전공은 컴퓨터 공학이지만, 졸업 후 프로그램을 짜보지 않았습니다.
최근 Flex의 무한한 가능성에 반하여, 나이 50을 향해 가고 있는 지금
Flex관련 작은 프로젝트를 하게되어 직접 프로그램을 하고 있습니다.

다시 한번 영원님의 정보에 감사 드립니다.
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.11.25 13:59 신고 | PERMALINK | EDIT/DEL
안녕하세요? 박대호대표이사님.
제 글이 도움이 되셨다니 상당히 기쁩니다. ;)
덧글 남겨주셔서 감사드리고, 질문할 것이 있으시다면 메일로 해주셔도 됩니다. ;)
부산지역에도 IT 업체가 많아져야 좋을텐데요 ;) 김해에서 대학을 다녀서 그런지 부산이시라니 친근감이 드네요 ㅎㅎ 좋은 하루 되시길.
박대호 | 2009.12.03 20:12 | PERMALINK | EDIT/DEL | REPLY
관리자의 승인을 기다리고 있는 댓글입니다
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.12.05 09:46 신고 | PERMALINK | EDIT/DEL | REPLY
안녕하세요? 박대호 대표이사님 ;)
덧글은 잘 보았습니다. 우선 이메일과 전화번호가 남겨져 있어 승인은 하지 않았습니다. ^^; (봇들이 수집을 하기때문에 ^^:)

현재 모듈을 사용하시기 때문에 문제가 되는 듯 합니다. 모듈의 특성상 모듈이 언로드 되게되면 모듈이 가지고 있던 클래스도 같이 언로드 되게 되는데요, 이때 DataService 관련 클래스들도 같이 언로드되는듯 하네요. Application 에서 DataService 를 가지고 있도록 처리해보심 어떨까 싶네요. data management 로 개발한 경험이 없어서 관련 부분은 조언을 드리기가 어렵습니다. ^^;

어떤 에러가 나는지 에러메세지를 좀 보내주셔도 제가 찾아볼 수 있겠네요.
(이메일로 보낸 내용이나 주소가 잘못되었는지 반송되었더군요. 보실지 모르겠으나 덧글로 남겼습니다. )
Favicon of http://blog.flashplatform.kr BlogIcon 검쉰 | 2009.12.05 14:08 신고 | PERMALINK | EDIT/DEL
지돌스타형 블로그에 올라온 글을 보니 메일주소를 잘못남겨주셨네요 ^^;;;
박대호 | 2009.12.10 23:37 신고 | PERMALINK | EDIT/DEL | REPLY
감사 합니다.
문제는 해결되엇는데,,,
심경쓰 주셔서 감사 합니다.
김선구 | 2009.12.24 09:47 신고 | PERMALINK | EDIT/DEL | REPLY
4번을 쓸려고 datagrid를 재정의했는데, dataprovider에 null 값이 들어가있어서 에러가났습니다.
dataprovider 에는 arraycollection 형태의 값이 들어가게 되있고요, datagrid선언부분은
<cp:myDatagrid ~~
<cp:columns>
<mx:datagridcolumn~
형식으로 되어있습니다..
김정환 | 2012.09.26 14:57 | PERMALINK | EDIT/DEL | REPLY
관리자의 승인을 기다리고 있는 댓글입니다
김정환 | 2012.10.05 13:12 | PERMALINK | EDIT/DEL | REPLY
관리자의 승인을 기다리고 있는 댓글입니다
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret

티스토리 툴바