반응형

출처 : http://wonsama.tistory.com/211

 

0. 참조 문서
blazeDS 개발자 가이드 : http://livedocs.adobe.com/blazeds/1/blazeds_devguide/

blazeDS 다운로드 : http://opensource.adobe.com/wiki/display/blazeds/download+blazeds+3



 

1. blazeds.war 파일 다운로드 이후 Eclipse or Tomcat Import



 

2. 중요 참조 [jre 5.0 이상에서만 동작함에 유의 !]



blazeds.war 파일을 초기 import 하면 WEB-INF 폴더가 생성됩니다.

WEB-INF
└flex
  └ services-config.xml : 전반적인 서비스 설정을 포함.
  └ messaging-config.xml : Message Push 서비스 등 메시지 관련 서비스 설정을 포함.
  └ remoting-config.xml : Remote Object 호출 서비스 설정을 포함.
  └ proxy-config.xml : 프록시 서비스를 사용할 때
└lib - Flex에서 사용되는 library 파일이 존재하는 폴더
└web.xml - Flex Session Management, MessageBroker Servlet 설정에 대한 내용 포함.

3. services-config.xml



: 기본 채널의 설정 및 포함하는 서비스 파일의 경로를 확인 할 수 있다.
my-amf, my-secure-amf, my-polling-amf ..

4. 나머지 .xml 파일



- 설정된 해당 서비스를 확인할 수 있다.
- destination id 설정을 통해 flex에서 접근할 수 있도록 설정한다.

ex)

ㄱ. MessagePush : 해당 채널에 대한 종착점 id를 설정한다.
< destination id="realMsg"/>

ㄴ. Remote Object : 해당 원격지 클래스를 호출하기 위한 종착점 id를 설정한다.
< destination id="fruitRO">
        <properties>
            <source>wonsama.test.FruitManager</source>
        </properties>
< /destination>

5. 기타 확인사항



ㄱ. <default-channels> 하위 노드에 여러개의 채널이 선언된 경우
맨 위쪽 부터 처리하며, 채널이 동작하지 않는 경우 다음 채널 서비스를 실행한다.

    <default-channels>
        <channel ref="my-streaming-amf"/> <!-- 처음 실행됨 -->
      <channel ref="my-polling-amf"/> <!-- 위 채널이 동작하지 않으면 동작 -->
    </default-channels>

ㄴ. StreamingAMFChannel 사용 시 <properties>의 하위노드가 1개 이상 존재해야 한다.
==> 존재하지 않으면 Explore에서 정상적으로 MessagePush가 동작하지 않음. (버그인듯?)

ex)
< channel-definition id="my-streaming-amf"
    class="mx.messaging.channels.StreamingAMFChannel">
    <endpoint
        url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf"
        class="flex.messaging.endpoints.StreamingAMFEndpoint" />
    <properties>
        <idle-timeout-minutes>0</idle-timeout-minutes>
        <max-streaming-clients>10</max-streaming-clients>
        <server-to-client-heartbeat-millis>5000    </server-to-client-heartbeat-millis>
        <user-agent-settings>
            <user-agent match-on="MSIE" kickstart-bytes="2048"
                        max-streaming-connections-per-session="3" />
            <user-agent match-on="Firefox" kickstart-bytes="2048"
                        max-streaming-connections-per-session="3" />
        </user-agent-settings>
    </properties>
< /channel-definition>

ㄷ. 익스플로러에서 모든 창을 종료하지 않으면 Messaging Service에서 Lock이 발생되어 실시간 메시지 수신을 할 수 없다(약 10초 ~ ???초). (MessageBroker쪽)

파폭에서는 발생하지 않지만 익스플로러에서는 위와 같은 문제가 발생하네여 아.... 초난감 ;;
24시간 시간 모니터링 툴을 제작시 반드시 고려를 하시기 바랍니다. 프로젝트 3개월 차에 이런 버그를 발견해 내서리 쩝...

고객사에는 뭐 끄지마세요 이런식으로 -_-; 아.... 중요 정보 인것 같아 이전 포스트에 덧칠하여 다시 올려 봅니다.

Posted by 1010
반응형

The DateFormatter class uses a format String to return a formatted date and time String from an input String or a Date object. The DateFormatter is a very simple formatter. To use it you just have to specify the formatString property, apply the format and you are done.
<mx:DateFormatter formatString="Y|M|D|A|E|H|J|K|L|N|S"/>
Here are some short explanations of what the characters in formatString represent:

Y – Year
M – month
D – Day
A – AM/PM indicator
E – day of the week
H – Hour (1-24 hours format)
J – Hour (0-23 hours format)
K – Hour in am/pm (0-11 hours format)
L – Hour in am/pm (1-12 hours format)
N – Minutes
S – Seconds
The formatString may also contain other words as separators between Y, M, D, A etc. as we will see in the example below.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical
   backgroundColor="white" 
    creationComplete="formatDates()" viewSourceURL="srcview/index.html">
    
    <mx:Script>
        <![CDATA[
            private function formatDates():void
            {
                dateFormatter.formatString = "DD/MM/YY";
                formattedDate1.text = dateFormatter.format(initialDate.text);
                dateFormatter.formatString = "EEE DD/MM/YY";
                formattedDate2.text = dateFormatter.format(initialDate.text);
                dateFormatter.formatString = "EEEE DD/MM/YY";
                formattedDate3.text = dateFormatter.format(initialDate.text);
                dateFormatter.formatString = "EEEE DD MMM YYYY";
                formattedDate4.text = dateFormatter.format(initialDate.text);
                dateFormatter.formatString = "EEEE DD MMMM YYYY";
                formattedDate5.text = dateFormatter.format(initialDate.text);
                dateFormatter.formatString = "EEEE DD MMMM YYYY at HH:NN";
                formattedDate6.text = dateFormatter.format(initialDate.text);
                dateFormatter.formatString = "EEEE DD MMMM YYYY at HH:NN A";
                formattedDate7.text = dateFormatter.format(initialDate.text);
                dateFormatter.formatString = "EEEE DD MMMM YYYY at HH:NN.SS A";
                formattedDate8.text = dateFormatter.format(initialDate.text);
            }
        ]]>
    </mx:Script>
    
    <mx:DateFormatter id="dateFormatter" />
    <mx:Text text="Change The Initial Date And Format The New Dates
       fontWeight="bold"/>    
    <mx:Form>
        <mx:FormItem label="Initial Date:" >
            <mx:TextInput id="initialDate" text="01.01.2009 10:34 57" />
        </mx:FormItem>
        <mx:FormItem label="DD/MM/YY" >
            <mx:TextInput id="formattedDate1" />
        </mx:FormItem>
        <mx:FormItem label="EEE DD/MM/YY" >
            <mx:TextInput id="formattedDate2" />
        </mx:FormItem>
        <mx:FormItem label="EEEE DD/MM/YY" >
            <mx:TextInput id="formattedDate3" />
        </mx:FormItem>
        <mx:FormItem label="EEEE DD MMM YYYY" >
            <mx:TextInput id="formattedDate4" />
        </mx:FormItem>
        <mx:FormItem label="EEEE DD MMMM YYYY" >
            <mx:TextInput id="formattedDate5" />
        </mx:FormItem>
        <mx:FormItem label="EEEE DD MMMM YYYY at HH:NN" >
            <mx:TextInput id="formattedDate6" />
        </mx:FormItem>
        <mx:FormItem label="EEEE DD MMMM YYYY at HH:NN A" >
            <mx:TextInput id="formattedDate7" />
        </mx:FormItem>
        <mx:FormItem label="EEEE DD MMMM YYYY at HH:NN.SS A" >
            <mx:TextInput id="formattedDate8" />
        </mx:FormItem>
        <mx:FormItem >
            <mx:Button click="formatDates()" label="format dates"/>
        </mx:FormItem>
    </mx:Form></mx:Application>

 

Posted by 1010
반응형

Integrating Adobe Flex and IBM WebSphere Portal

Xiang Cheng (xcheng@cn.ibm.com), Software Engineer, IBM China
Zhi Hao Zhang (zhangzh@cn.ibm.com), Software Engineer, IBM China
Jia Gu (gujia@cn.ibm.com), Software Engineer, IBM China

Summary:  Adobe® Flex takes you to the next level of Web application development with the concept of Rich Internet Applications (RIAs), while IBM® WebSphere® Portal provides a composite tooling to build flexible, SOA-based solutions. But how do you get the two of them together? One option is to directly integrate Flex into WebSphere Portal server. This article walks you through a process to quickly build rich client and component-based Flex applications for WebSphere Portal, as well as a helpful method to reduce the size of WAR files.

Date:  12 May 2009
Level:  Introductory PDF:  A4 and Letter (520KB | 21 pages)Get Adobe® Reader®
Also available in:   Chinese

Activity:  19673 views
Comments:   3 (View | Add comment - Sign in)

Average rating 3 stars based on 12 votes Average rating (12 votes)
Rate this article

Prerequisites

This article is for Flex developers who want to integrate their applications with WebSphere Portal. It assumes that you are familiar with Flex at a basic programming level and that you are familiar with Java™ programming. It also assumes that you have administrative access to a working WebSphere Portal server for the relevant portions of the article. It does not, however, assume that you are familiar with programming or administering WebSphere Portal.

Along with this article, you will need the following tools installed to make sure the sample case works well.

  • Adobe Flex Builder — This article is written with Adobe Flex Builder 3. Of course, you can do it with the appropriate JDK and a text editor, but the amount of extra work is significant.
  • WebSphere Portal V6.0.1 or higher — If you are using WebSphere Portal V6.0, you should update your WebSphere Portal V6 environment. (See Resources.)
  • IBM Rational Software Architecture v7.0.0
  • IBM DB2 Enterprise v9.1

Overview of sample application

Let's briefly look at the business requirements of this sample application called TODOList. Many users want to keep records for their appointments, anniversaries, reminders, or any events. And they need to conveniently view their coming items, create new items, and delete any items if possible. Can we provide a smart tool to help them? In this article, we will show you how to build the application in a process that is similar to the way most developers create applications in order to illustrate the complete development procedures.

Figure 1 below shows the sample application infrastructure. We will quickly state the technical aspects of the sample before building the actual application with Adobe Flex and IBM WebSphere Portal. The whole application will be built in a WAR file, including presentation layer and business layer modules, although they are developed in the different projects.

The top rectangle represents a Flex project as the presentation layer that is built by MXML and ActionScript, while the bottom rectangle represents a Java project as the business layer that is built by Java and JDBC. The Flex application calls a Java service through a RemoteObject that is one of the remote procedure call (RPC) components provided by Flex. In this sample application, we will import BlazeDS to implement the remote object.


Figure 1. Infrastructure
A block diagram shows the relationships between the various components within WebSphere Portal.  The Presentation Layer is shown at the top with the Business Layer in the bottom, connected together through BlazeDS(remote object.)  MXML and AS are shown in the Presentation Layer.  Services and JDBC are shown in the Business layer.  A further connection goes to DB2 outside of the business layer from JDBC.

Build Flex project

Adobe Flex is a highly productive, free, open source framework for building and maintaining expressive Web applications that deploy consistently on all major browsers, desktops, and operating systems.

It consists of a rich component library with more than 100 proven, extensible UI components for creating RIAs. It also provides a standard-based language and programming model that supports common design patterns. MXML, a declarative XML-based language, is used to represent UI layout and behaviors, and each MXML file is a separate component. ActionScript, a powerful object-oriented programming language, is used to create client logic. ActionScript provides flow control and object manipulation features that are not available in MXML. Flex 3 was released at the end February 2008, and you can learn more about Flex 3 features from the Adobe Flex Web site. (See Resources.)

Flex applications can be built only by the free Flex SDK, which comprises the Flex framework (component class library) and Flex compiler, enabling you to freely develop and deploy Flex applications using an IDE of your choice. Developers can use Adobe Flex Builder 3 to dramatically accelerate development.

The Flex wizard guides you on how to quickly and easily create this sample in Flex Builder 3.

  1. Open Flex Builder 3, and select File --> New --> Flex Project.
  2. Enter TODOListFlex as the project name.
  3. Select the default location, which is the workspace, as the project location.
  4. Choose Web application as the application type.
  5. For the application server type, you may follow the steps in Adobe Flex 3 Help\Using Flex Builder 3\Flex Builder Basic\Working With Projects if you have a server. But in this sample, we select None, as the Figure 2 screen shot shows, because we don't need that.

Figure 2. New Flex project
A file tree shows the contents of TODOListFlex, including the folders bin-debug, html-template, libs and src.  Src is further expanded to show a folder image containing the file icon-delete.gif, a folder model containing the file TodoItemVBean.as, the folder util containing the file TokenResponder.as, and the file TODOListFlex.mxml.
  1. Keep all default settings for this Flex application and the build paths in the next two configuration pages.
  2. Click Finish to create this project.

Then, Flex Builder 3 will generate a primary MXML with the same name of new project. This application includes a MXML file, which starts with the <mx:Application> root tag, as follows in Listing 1.


Listing 1. MXML application root
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
</mx:Application>
            

In this section, you only need to care about the main file, TODOListFlex.mxml. You can use the Flex navigator view to import other resources (MXML, ActionScript, and Image) into the project from our sample code. A view of the project category is shown below in Figure 3.


Figure 3. Flex project category
A file tree shows the contents of TODOListFlex, including the folders bin-debug, html-template, libs and src.  Src is further expanded to show a folder image containing the file icon-delete.gif, a folder model containing the file TodoItemVBean.as, the folder util containing the file TokenResponder.as, and the file TODOListFlex.mxml.

The MXML editor in Flex Builder 3 allows you to work in either Source or Design mode at the top of the editor area. Make sure that you are in Source mode, and then add a <mx:Panel> component as the child of the main application to represent UI layout, and place a <mx:VBox> component in this panel to make it lay in vertical. See Listing 2.


Listing 2. Add panel and VBox in MXML file
<mx:Panel title="TODO List" width="100%" height="100%" 
   paddingLeft="4" paddingTop="8" paddingRight="8" paddingBottom="4">
   <mx:VBox width="100%">
   </mx:VBox>
</mx:Panel>

Put a <mx:DataGrid> component between <mx:VBox> tags to list all to-do items. We define an ArrayCollection todoItemColl and assign it as the dataProvider for the DataGrid. (See Listing 3.) We will call RemoteObject service to obtain data for this ArrayCollection in the section, "Use RemoteObject in Flex."


Listing 3. Add DataGrid in VBox
<mx:DataGrid id="todoListDG" dataProvider="{todoItemColl}">
   <mx:columns>
   <mx:DataGridColumn visible="false" dataField="id"/>
   <mx:DataGridColumn width="100" headerText="Date" dataField="deadlineStr"/>
   <mx:DataGridColumn width="400" headerText="Subject" dataField="task"/>
   ...
   </mx:columns>
</mx:DataGrid>

There is a form under the VBox to allow users to add new to-do items. The form contains three text fields (such as Date, Subject, and Owner) and a button. We use a <mx:Grid> component here to control the UI alignment. (See Listing 4.)


Listing 4. Add grid for item form
<mx:Grid>
   <mx:GridRow>
      <mx:GridItem> 
         <mx:Label text="Date:"/>
      </mx:GridItem>
      <mx:GridItem>
         <mx:DateField id="deadlineDateField" formatString="YYYY-MM-DD"/>
      </mx:GridItem>
   </mx:GridRow>
   ...
   <mx:GridRow>
      <mx:GridItem colSpan="2" horizontalAlign="right">
         <mx:Button label="Add" click="saveNewItem()"/>
      </mx:GridItem>
   </mx:GridRow>
</mx:Grid>

Then we create client logic with ActionScript codes within a <mx:Script> tag and wrap the contents in a CDATA construct. (See Listing 5.) To access the different data sources, we define a constant, USE_MOCK_DATA, to control whether the application accesses remote data or local mock data. Now we set the constant value to be true because we are just showing it as a separate application for now. We will elaborate on how to use RemoteObject Service to assess data in the section, "Use RemoteObject in Flex."


Listing 5. Add script to call data source
<mx:Script>
   <![CDATA[
      …
      private static const USE_MOCK_DATA:Boolean = true;	…
      private function getTodoList():void
      {
         if(USE_MOCK_DATA) {
            // Creat the mock data
         }
         else {
            // Use remote object to access the back-service
         }
      }
      …
   ]]>
</mx:Script>

You will find more sample code in the attachment. (See Downloads.) After the above steps, select TODOListFlex.mxml and click the Run button at the toolbar. Flex Builder will compile this application and show the below pages, as in Figure 4.


Figure 4. TODOList Page
A screen shot of the TODOList Page showing a title, TODO List at the top.  Below that is a label which reads Total 3 TODO item(s).  Beneath the label is a table with four columns labeled from left to right Date, Subject, Owner.  The fourth columns is unlabeled.  Next follow three sample Todos with a date in column 1, a description in column 2, a person's name in column 3 and a checked box in the fourth column.  Under the table are entry fields for Date, Subject and Owner with an Add button.

Build portal project

WebSphere Portal is a framework that lets you plug in new features or extensions called portlets. Portlets are applications within WebSphere Portal, which are the encapsulation of reusable components that combine Web-based content, application functionality, and access to resources.

WebSphere Portal, starting with Version 5.0.2.1, provides a runtime environment for both JSR 168 Portlet API and IBM Portlet API. JSR 168 is a specification from the Java Community Process for the standardization of portlets. The specification was developed to provide interoperability for running portlets on any vendor's implementation of the JSR 168 portlet container. The IBM Portlet API is now deprecated in WebSphere Portal V6.0 in order to show IBM's commitment to the JSR 168 standard portlet API. Also, many new functions will only be available to standard portlets. We will use the JSR 168 standard portlet in our sample.

This section shows how to create a new portlet project using the Rational Software Architecture (RSA) wizard. (See Figure 5.)

  1. Open RSA, and select File --> New --> Project.
  2. Select Portlet Project to create a project.
  3. Enter TODOList as the project name.
  4. Target runtime should be WebSphere Portal V6.0 stub.
  5. Portlet API should be JSR 168 Portlet.
  6. Select the checkbox of "Create a portlet".
  7. Make sure the Basic Portlet is selected as Portlet type.
  8. Click Next, leaving all fields as default.
  9. Click Finish to create the portlet project.

Figure 5. New portlet project
New Portlet Project window with the following settings: Project name is "TODOList;" Project contents has "use default" checked; Target Runtime is "WebSphere Portal v6.0 stub;" EAR Membership has "Add project to an EAR" checked and EAR Project Name set to "TODOListEAR;" Portlet API is "JSR 168 Portlet;" Create a portlet is checked; Portlet name is "TODOList;" Portlet type is "Basic Portlet;" Show advanced settings is checked.

After you finish the above steps, the project category should look like Figure 6.


Figure 6. Portlet project category
The file structure of the New Portlet Project is shown with a root of TODOList with the skeletal structure and components created.

Actually, you can deploy this portlet on your portal server now. But we will integrate the Flex application created in the previous section into the portlet project first.


Integrate Flex into the portlet project

To integrate the Flex application into our portlet project we must complete a few steps.

Introducing Web-tier compiler

The Flex compiler creates SWF files that run in Adobe Flash Player. Flex offers several kinds of compilers: the Web-tier compiler, the mxmlc command-line compiler, and the Flex Builder project compiler. In this article, we will use the Web-tier compiler, which is a set of servlets and servlet filters that run in a J2EE application server. The application server passes on requests from *.mxml files to the servlet container, which then compiles into a SWF file and returns the results to the client. In this case, it allows you to simply copy the Flex files into a directory visible to your server, and the flex codes will be compiled automatically when you request the main application file using your Web browser. This also allows you to rapidly compile, test, and deploy an application instead of compiling your MXML files into a SWF file and then deploying its wrapper files on a Web server.

You should download the FlexModule_J2ER from the Adobe open source Web site if you have not already. Do the following steps to introduce it into this sample portlet project.

  1. Unzip the webtier.war file to a directory called webtier.
  2. Copy flex-bootstrap.jar and flex-bootstrap-jsp.jar from the webtier\WEB-INF\lib to the corresponding WEB-INF\lib directory of the portlet project.
  3. Copy all files and directories from the webtier\WEB-INF\flex directory to the corresponding WEB-INF\flex directory of the portlet project.
  4. Update web.xml file content in the WEB-INF\ directory of the portlet project according to the web.xml file in the webtier\WEB-INF (You can copy the web.xml from the sample code which we have updated accordingly -- see Downloads).

Introducing BlazeDS

The Flex SDK contains features for accessing server-side data. These components use RPC to interact with server environments to provide data to Flex applications and send data to back-end data sources.

Three kinds of RPC components are supported by Flex: HTTPService, WebService, and RemoteObject. A client-side RPC component calls a remote service and then stores the response data in an ActionScript object where you can easily obtain the data.

RemoteObject

We use the RemoteObject component in this sample because it lets you access business logic directly in its native format rather than formatting it as XML, as you do with HTTPService or WebService. This saves you the time required to expose existing logic as XML. The Flex application can access a Java object directly by remote invocation of a method on a designated object. Those objects on the server can then deal with its native data types as arguments, query a database from those arguments, and return its native data types as values.

Another benefit of RemoteObject services is the speed of communication across the wire. Data exchanges still happen over HTTP or HTTPS, but the data itself is serialized into the Action Message Format (AMF), which is a binary format for data serialization/deserialization and remote method invocation. It improves performance by dramatically compressing the size of data transferred and parsing binary data into objects in memory far more efficiently than parsing XML data.

Using BlazeDS

BlazeDS is an Adobe open source project that employs RemoteObject component to access remote Java objects. It contains configurable channels that transport the data between the client and server and can run on a J2EE application server.

You can download the BladeDS package from the Adobe open source Web site. (See Resources.) Do the following steps to enable this portlet application to use BlazeDS:

  1. Unzip the blazeds.war to a directory called blazeds.
  2. Copy all jar files from blazeds\WEB-INF\lib to the WEB-INF\lib directory.
  3. Copy all configuration files from the blazeds\WEB-INF\flex directory to the WEB-INF\flex directory of this application. Overwrite if there are existing ones.
  4. Define MessageBrokerServlet and a session listener in WEB-INF\web.xml of this portlet application, as below in Listing 6. You can skip this step if you copied the web.xml from our sample code.

Listing 6. Define MessageBrokerSerlet and session listener
<!-- Http Flex Session attribute and binding listener support -->
<listener>
   <listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>
	
<!-- MessageBroker Servlet -->
<servlet>
   <servlet-name>MessageBrokerServlet</servlet-name>
   <display-name>MessageBrokerServlet</display-name>
   <servlet-class> flex.messaging.MessageBrokerServlet </servlet-class>

   <init-param>
      <param-name>services.configuration.file</param-name>
      <param-value>/WEB-INF/flex/services-config.xml</param-value>
   </init-param>

   <load-on-startup>1</load-on-startup>
</servlet>
         

Copy Flex code into the portlet project

Copy all files under the src directory from the Flex project to the directory, WebContent/_TODOList/jsp/html. The category of the portlet project should look like Figure 7.


Figure 7. Copy Flex code into portlet
The file structure of the TODOList project is shown.  Under the WebContent, _TODOList, jsp, html section are the files TODOListFlex.mxml and TODOListPortletView.jsp.

Create Java RemoteObject class

For simplicity, we need only one Java RemoteObject class, TodoItemRO, as the remote business service. You can copy the Java source code and the jdbc.properties file from the sample code (WEB-INF\src) to the portlet project. TodoItem is the only entity Java bean in this sample. (See Figure 8.)


Figure 8. Java RemoteObject class
Diagram shows two boxes side by side.  On the left is the Java Class TodoItemBO with the contained components.  On the right is the Java Class containing TodoItem with its components.  A connecter labeled "use" runs TodoItemBO to TodoItem.

Configure RemoteObject in portal

Flex finds the remote services according to its configuration file, services-config.xml, in the WEB-INF\flex. You need to specify the fully qualified class name in the source property of a remoting service destination in the BlazeDS services-config.xml file, or a file that it includes by reference, such as the remoting-config.xml file. The class also must have a no-arg constructor which will be used by Flex to instantiate an instance. We configured the single Java RemoteObject in the remoting-config.xml file which is in WEB-INF\flex, as below in Listing 7.


Listing 7. Configure RemoteObject in portal
<destination id= ‘todoItemRO’>
   <properties>			 
      <source> todolist.ro.TodoItemRO </source>
   </properties>
</destination> 
            

Use RemoteObject in Flex

Now that we have created and configured the remote object, it's time to use it as a remote service.

First, create a RemoteObject component in TODOListFlex.mxml with a unique ID, srvTODOList. The value of the destination should match the destination entry in the WEB-INF\flex\remoting-config.xml file in the portal project. In this sample, it is todoItemRO. (See Listing 8.)


Listing 8. Create RemoteObject component in Flex
<mx:RemoteObject id="srvTODOList" destination="todoItemRO" showBusyCursor="true" 
requestTimeout="10"/>
           

Next, create an AsyncToken object to call the Java method defined in the destination service using the unique ID of the RemoteObject component. The AsyncToken class provides a place to set additional or token-level data for asynchronous RPC operations.

It also allows an IResponder to be attached for an individual call (or, callback method). We define a simple responder class, TokenResponder, that implements the IResponder Interface (see the code sample, TODOListFlex\src\util\TokenResponder.as). It will call the specified callback method when Java returns or raises a specified alert as the handler of any fault. We add it as the responder of the AsyncToken object, get the response data, and transform it into a Flex variable type. (See Listing 9.)


Listing 9. Create callback method in Flex
var asyncToken:AsyncToken = AsyncToken(srvTODOList.getTodoItems());
asyncToken.addResponder(new TokenResponder(displayTodoItems, "Error Getting TODO List"));

private function displayTodoItems(event:ResultEvent):void
{
   todoItemColl = event.result as ArrayCollection;
   todoItemColl.refresh();
}
           

Include Flex component in JSP

The Flex compiler module for J2EE application servers also provides a JSP tag library that lets you include Flex applications in JSPs. Add the following tag library declaration to your JSP page to import Flex 3 Tag Library in JSP: WebContent\_TODOList\jsp\html\TODOListPortletView.jsp. (See Listing 10.)


Listing 10. Include Flex tag library in JSP
<%@ taglib uri="FlexTagLib" prefix="mm" %>

You can either refer a separate MXML file or include MXML syntax directly in the JSP by the <mm:mxml> tag. (See Listing 11.)


Listing 11. Include Flex project in JSP
<mm:mxml source="TODOListFlex.mxml" width="100%" height="768">
</mm:mxml>

You can delete all old content of the JSP which is generated by RSA. You can refer to the JSP in the sample code.


Deployment

Make use of the J2EE Web application archive feature in RSA to export a WAR file so that you can install on a staging or production portal server.

Make sure that the constant USE_MOCK_DATA in the WebContent\_TODOList\jsp\html\TODOListFlex.mxml file has been set to false in order to use RemoteObject to get TODO list. Copy the DB2 JDBC driver jars from sample code to the WEB-INF\lib.

Do the following steps to export the WAR file from this sample project.

  1. Right-click this sample project name and select Export from the pop-up menu.
  2. Select WAR file in the Export window, and then select Next.
  3. Specify a location for the new WAR file.
  4. Click Finish and make sure you can find the WAR file under the location.

Log on to WebSphere Portal Server with the administrator role, and go to the Administrative page to install the WAR file by following these steps.

  1. If it's not already running, start the portal server. From the control panel select Portlet Management , Web Modules.
  2. On the "Manage Web Modules" page, click Install.
  3. On the "Installing a Web module" page, use the Browse button to locate the WAR file. Click Next and Finish. This step may take several minutes due to the large size. You can reduce the size of the WAR using shared lib. (Refer to the section, "Reduce WAR size".)

After installing the portlet, we need to place it into a page. From the Administrative page of the portal server do the following steps.

  1. Navigate to Portal --> User Interface --> Manage Pages.
  2. Locate the page to add a portlet and click Edit Page Layout.
  3. Add the portlet (TODOList) in the page, and click Done to save the changes.

Now go the page and verify the TODOList portlet.


Figure 9. TODOList Portlet
A screen shot shows the TODOList screen from before.  The title is TODOList.  Beneath the title is a label reading "Total 1 TODO item(s).  Then follows a table with 4 columns, labeled from left to right: Date, Subject and Owner.  The 4th column has no label.  One entry is shown in the table, with the Date as "2008-10-06," the Subject as "Submit the paper," and the Owner as "Sean."  The 4th column contains a box which is checked.  Below the table are data entry fields containing the same information listed in the table with an Add button.

If you host your portal server on a Linux® system (skip this section if you are using a Windows® system), the flash may not be displayed. You may need to configure the java.awt.headless parameter for JVM of portal server as value of true. Follow these steps to do so:

  1. Start the WebSphere Application Server: /opt/IBM/WebSphere/AppServer/bin/startServer.sh server1
  2. Open the WebSphere Application Server Administrative Console: http://server:10001/ibm/console
  3. Navigate to Server --> Application Server --> WebSphere_Portal --> Process Definition --> Java Virtual --> Custom Properties

Figure 10. Configure the java.awt.headless
A screen shot shows the administrative tool for Websphere on the screen Application servers, WebSphere Portal, Process Definition, Java Virtual Machine, Custom Properties.  The value java.awt.headless has been set to "true."
  1. Restart the WebSphere Application Server and Portal Server.

Reduce WAR size (shared lib)

This step is optional. Because the size of the WAR may be larger than 20MB, you can move some of the contents into the WebSphere Application Service shared lib in order to reduce the size. Refer to the section, "Create a shared library", in the developerWorks article, "Using resource environment providers in WebSphere Application Server". (See Resources.)


Summary

This article covered the major features and enhancements during the integration development between Adobe Flex and WebSphere Portal. We also examined the runtime environment used to show the sample application and how easy it can be to create an RIA application and integrate Portal features before delivering the applications for an improved user experience.



Download

Description Name Size Download method
Sample code TODOList.war 23MB HTTP

Information about download methods


Resources

Learn

Get products and technologies

Posted by 1010
반응형
 

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute">
 <mx:Script>
       
  import mx.controls.Menu;
  import mx.events.MenuEvent;
  private var myMenu:Menu;
  private function createAndShow():void {
   ta1.text="";
   myMenu = Menu.createMenu(null, myMenuData, false);
   myMenu.labelField="@label";
   myMenu.addEventListener(MenuEvent.ITEM_ROLL_OVER,menuShowInfo);
   myMenu.show(225, 10);
  }
  private function menuShowInfo(event:MenuEvent):void {
   ta1.text="event.type: " + event.type;
   ta1.text+="\nevent.label: " + event.label;
   ta1.text+="\nevent.index: " + event.index;
   if (event.item) {
    ta1.text+="\nItem label: " + event.item.@label
    ta1.text+="\nItem selected: " + event.item.@toggled;
    ta1.text+= "\nItem type: " + event.item.@type;
   }
  }
  
  [Bindable]
  public var menuData:Array = [
   {label: "MenuItem A", children: [
    {label: "SubMenuItem A-1", enabled: false},
    {label: "SubMenuItem A-2", type: "normal"}]},
   {label: "MenuItem B", type: "check", toggled: true},
   {label: "MenuItem C", type: "check", toggled: false},
   {type: "separator"},
   {label: "MenuItem D", children: [
    {label: "SubMenuItem D-1", type: "radio", groupName: "g1"},
    {label: "SubMenuItem D-2", type: "radio", groupName: "g1",toggled: true},
    {label: "SubMenuItem D-3", type: "radio", groupName: "g1"}]}
  ];
  
 </mx:Script>
 <mx:XML id="myMenuData">
  <xmlRoot>
   <menuitem label="MenuItem A">
    <menuitem label="SubMenuItem A-1" enabled="false" />
    <menuitem label="SubMenuItem A-2" />
   </menuitem>
   <menuitem label="MenuItem B" type="check" toggled="true" />
   <menuitem label="MenuItem C" type="check" toggled="false" />
   <menuitem type="separator" />
   <menuitem label="MenuItem D">
    <menuitem label="SubMenuItem D-1" type="radio" groupName="one" />
    <menuitem label="SubMenuItem D-2" type="radio" groupName="one" toggled="true" />
    <menuitem label="SubMenuItem D-3" type="radio" groupName="one" />
   </menuitem>
  </xmlRoot>
 </mx:XML>
 <mx:Button x="10" y="5" label="Open XML Popup" click="createAndShow();" />
 <mx:TextArea x="10" y="70" width="200" height="300" id="ta1" />
</mx:Application>

 

Posted by 1010
반응형

In this article I will create a custom Spark Panel component that will look something like this:

Spark Panel Component Skin

You can find the working example lower on this page.

There are five steps that you must take to create a new Flex 4 Skin (for any Spark component):

  1. Create a new MXML component that extends the SparkSkin class
  2. Define the states of the Skin. The default states for most of the components are normal and disabled
  3. Define the HostComponent between Metadata tags
  4. Specify all the graphical elements that are used by the custom Skin
  5. Define the skin parts for the skin

So the first thing that I did was to create a custom MXML component for the Spark Panel skin. I created this component in the skins folder and I named the custom skin PanelSkin.

The next step was to define the states of the skin. To see what states are available for any Spark component you should check out the Adobe ActionScript 3.0 Reference for the Adobe Flash Platform online documentation.

For the Spark Panel custom skin I used four states:

	<s:states>
		<s:State name="normal" />
		<s:State name="disabled" />
		<s:State name="normalWithControlBar" />
		<s:State name="disabledWithControlBar" />
	</s:states>

The normal and disabled states are the default states when the Panel does not have a Control Bar. The normalWithControlBar and disabledWithControlBar states are used when the Panel is defined with a Control Bar.

Next we need to specify the HostComponent between Metadata tags. The HostComponent will be the path to the Spark component that will be skinned. In this case: spark.components.Panel:

	<fx:Metadata>
		[HostComponent("spark.components.Panel")]
	</fx:Metadata>

Next I specified all the graphical elements of the skin:

	<s:BorderContainer color="0xAAAAAA" cornerRadius="7"
					   width="100%" height="100%">
		<s:Rect width="100%" height="45" 
				topLeftRadiusX="7" topLeftRadiusY="7" topRightRadiusX="7" topRightRadiusY="7"
				top="0">
			<s:fill>
				<s:LinearGradient rotation="90">
					<s:entries>
						<s:GradientEntry color="#bf0000" />
						<s:GradientEntry color="#ff0011" />
					</s:entries>
				</s:LinearGradient>
			</s:fill>
		</s:Rect>
 
		<s:Rect bottomLeftRadiusX="7" bottomRightRadiusX="7"
				y="45"
				width="100%" height="100%">
			<s:fill>
				<s:LinearGradient rotation="90">
					<s:entries>
						<s:GradientEntry color="#f8f8f8" />
						<s:GradientEntry color="#CCCCCC" />
					</s:entries>
				</s:LinearGradient>
			</s:fill>
		</s:Rect>
 
		<s:Rect width="100%" height="40" 
				excludeFrom="normal, disabled"
				bottomLeftRadiusX="7" bottomLeftRadiusY="7" bottomRightRadiusX="7" bottomRightRadiusY="7"
				bottom="0">
			<s:fill>
				<s:LinearGradient rotation="90">
					<s:entries>
						<s:GradientEntry color="#3f3f3f" />
						<s:GradientEntry color="#a5a5a5" />
					</s:entries>
				</s:LinearGradient>
			</s:fill>
		</s:Rect>
	</s:BorderContainer>

At a glance this looks like a lot of code, but it is actually pretty straight forward. I declared a BorderContainer and inside this another three Rect blocks for the Panel header, Panel body and Panel Control Bar.

Inside every Rect block I have LinearGradient with different colors for every Rect. In the last Rect I added this code excludeFrom="normal, disabled" which will exclude this Control Bar from the Skin when the panel is declared without the Control Bar.

The last step is to define the skin parts. The Spark Panel has three skin parts: contentGroup for the Panel body, controlBarGroup for the Panel Control Group and titleDisplay for the Panel Header:

	<s:Label id="titleDisplay" 
			 paddingLeft="15" paddingRight="15" paddingTop="15"
			 color="white"
			 fontSize="18"
			 fontWeight="bold"
			 fontStyle="italic"/>
 
	<s:Group id="contentGroup">
		<s:layout>
			<s:VerticalLayout paddingTop="55" paddingBottom="10" paddingLeft="15" paddingRight="15"
							  paddingBottom.disabledWithControlBar="55" paddingTop.disabledWithControlBar="55"
							  paddingBottom.normalWithControlBar="55" paddingTop.normalWithControlBar="55"/>
		</s:layout>
	</s:Group>
 
	<s:Group id="controlBarGroup" bottom="10">
		<s:layout>
			<s:HorizontalLayout paddingLeft="5" paddingRight="5"/>
		</s:layout>
	</s:Group>

Ok, that’s all as far as the Panel Custom Skin is concerned. Now I will focus on the applying the Custom Skin to a few Panel instance in the application. To apply a Custom Skin to a Spark component you will use skinClass property like this:

	<s:Panel id="myPanel1"
			 skinClass="skins.PanelSkin"
			 title="My first panel title">

Here is the resulting application:


View Source is enabled in the above example. To view the source files right click on the swf and choose “View Source” from the context menu.

Here is the complete source code for the main application:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   viewSourceURL="srcview/index.html">
 
	<s:layout>
		<s:HorizontalLayout paddingTop="5" horizontalAlign="center" verticalAlign="middle"/>
	</s:layout>
 
	<s:Panel id="myPanel1"
			 skinClass="skins.PanelSkin"
			 title="My first panel title">
 
		<mx:Text text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. " 
				 width="200" />
 
		<s:controlBarContent>
			<s:Button label="First Button"/>
			<s:Button label="Second Button"/>
		</s:controlBarContent>
 
	</s:Panel>
 
	<s:Panel id="myPanel2"
			 skinClass="skins.PanelSkin"
			 title="My second panel title">
 
		<mx:Text text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. " 
				 width="200" />
 
	</s:Panel>
 
</s:Application>

And here is the complete source code for the Custom Skin Class:

<?xml version="1.0" encoding="utf-8"?>
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" 
			 xmlns:s="library://ns.adobe.com/flex/spark" 
			 xmlns:mx="library://ns.adobe.com/flex/mx" 
			 alpha.disabled="0.5" 
			 blendMode="normal">
 
	<s:states>
		<s:State name="normal" />
		<s:State name="disabled" />
		<s:State name="normalWithControlBar" />
		<s:State name="disabledWithControlBar" />
	</s:states>
 
	<fx:Metadata>
		[HostComponent("spark.components.Panel")]
	</fx:Metadata> 
 
	<s:BorderContainer color="0xAAAAAA" cornerRadius="7"
					   width="100%" height="100%">
		<s:Rect width="100%" height="45" 
				topLeftRadiusX="7" topLeftRadiusY="7" topRightRadiusX="7" topRightRadiusY="7"
				top="0">
			<s:fill>
				<s:LinearGradient rotation="90">
					<s:entries>
						<s:GradientEntry color="#bf0000" />
						<s:GradientEntry color="#ff0011" />
					</s:entries>
				</s:LinearGradient>
			</s:fill>
		</s:Rect>
 
		<s:Rect bottomLeftRadiusX="7" bottomRightRadiusX="7"
				y="45"
				width="100%" height="100%">
			<s:fill>
				<s:LinearGradient rotation="90">
					<s:entries>
						<s:GradientEntry color="#f8f8f8" />
						<s:GradientEntry color="#CCCCCC" />
					</s:entries>
				</s:LinearGradient>
			</s:fill>
		</s:Rect>
 
		<s:Rect width="100%" height="40" 
				excludeFrom="normal, disabled"
				bottomLeftRadiusX="7" bottomLeftRadiusY="7" bottomRightRadiusX="7" bottomRightRadiusY="7"
				bottom="0">
			<s:fill>
				<s:LinearGradient rotation="90">
					<s:entries>
						<s:GradientEntry color="#3f3f3f" />
						<s:GradientEntry color="#a5a5a5" />
					</s:entries>
				</s:LinearGradient>
			</s:fill>
		</s:Rect>
	</s:BorderContainer>
 
	<s:Label id="titleDisplay" 
			 paddingLeft="15" paddingRight="15" paddingTop="15"
			 color="white"
			 fontSize="18"
			 fontWeight="bold"
			 fontStyle="italic"/>
 
	<s:Group id="contentGroup">
		<s:layout>
			<s:VerticalLayout paddingTop="55" paddingBottom="10" paddingLeft="15" paddingRight="15"
							  paddingBottom.disabledWithControlBar="55" paddingTop.disabledWithControlBar="55"
							  paddingBottom.normalWithControlBar="55" paddingTop.normalWithControlBar="55"/>
		</s:layout>
	</s:Group>
 
	<s:Group id="controlBarGroup" bottom="10">
		<s:layout>
			<s:HorizontalLayout paddingLeft="5" paddingRight="5"/>
		</s:layout>
	</s:Group>
 
</s:SparkSkin>
Posted by 1010
반응형

The <mx:Panel> tag inherits all of the tag attributes of its superclass and adds the following tag attributes:

  <mx:Panel
   Properties
   layout="vertical|horizontal|absolute"
   status=""
   title=""
   titleIcon="null"
  
   Styles
   borderAlpha="0.4"
   borderThicknessBottom="NaN"
   borderThicknessLeft="10"
   borderThicknessRight="10"
   borderThicknessTop="2"
   controlBarStyleName="null"
   cornerRadius="4"
   dropShadowEnabled="true|false"
   footerColors="null"
   headerColors="null"
   headerHeight="Based on style of title"
   highlightAlphas="[0.3,0]"
   horizontalAlign="left|center|right"
   horizontalGap="8"
   modalTransparency="0.5"
   modalTransparencyBlur="3"
   modalTransparencyColor="#DDDDDD"
   modalTransparencyDuration="100"
   paddingBottom="0"
   paddingTop="0"
   roundedBottomCorners="false|true"
   shadowDirection="center|left|right"
   shadowDistance="2"
   statusStyleName="windowStatus"
   titleBackgroundSkin="TitleBackground"
   titleStyleName="windowStyles"
   verticalAlign="top|middle|bottom"
   verticalGap="6"
  
   Effects
   resizeEndEffect="Dissolve"
   resizeStartEffect="Dissolve"
   >
      ...
      child tags
      ...
  </mx:Panel>
  

View the examples

 

Posted by 1010
반응형

restrict = "ㄱ-힣"            :  한글만 입력가능.
restrict = "A-z"              :  영어만 입력가능.
restrict = "0-9"               :  숫자만 입력가능.
restrict = "0-9\-"           : 숫자와 '-'만 입력가능.
restrict = "^a-z"             : 소문자 a부터 z까지 제외한 모든문자 입력가능.
restrict = "A-z0-9\@\." : 이메일 형식만 입력가능.
restrict = "\\\"           : '\' 문자만 입력가능.
restrict = "\^"               :  '^' 문자만 입력가능.


 

 

Posted by 1010
반응형

에러 메시지 : 에러 메시지는 플렉스 빌더 2의 콘솔로 나오는 메시지가 대부분이고 일부 Runtiome Exception이라고 되어 있는 것은

웹브라우저의 플레시 플레이어 에서 나오는 메시지 이다.

* 에러 레벨 : 에러 레벨은 Warning 과 Error 가 있는데 Warning 은 경고성 메시지로 SWF 파일로 컴파일 되어 실행은 가능한 반면

Error는 컴파일이 되지 않으므로 반드시 원인을 찾아 고쳐야 한다.

Warning은 flex - config.xml 파일의 컴파일 옵션 중 " Show - actionscript - warnings " 를 false 로 설정하면 없어진다.

* 발생 원인 : 발생 원인이 되는 코드 패턴을 설명한 부분이다.

* 코드 예 : 에러 메시지가 나오는 코드의 예를 보여준다

* 해결책 : 에러를 수정하기 위해 해야할 조치를 설명한다.

1) 1008 : Variable my Var 에 형식 선언이 없습니다.

* 에러 레벨 : Warning

* 발생 원인 : my Var에 데이터 타입을 지정하지 않았을 경우 발생

* 코드 예 : Private Var My Var;

* 해결책 : Private Var my var : String; 식으로 데이터 타입을 지정해줌

2) 1084 : var 'my Var' 메소드에 namespace 속성이 없습니다.

이 속성은 'Package - private' namespace 의 기본값을 구성합니다.

* 에러 레벨 : Warning

* 발생 원인 : 변수나 메소드명에 제한자를 지정하지 않았을 떄 발생

* 코드 예 : var myvar : String;

* 해결책 : private var myvar : String; 이런 식으로 제한자를 지정해줌

3) 1084 : identifier 가 xxx 앞에 있어야 합니다.

* 에러 레벨 : Error

* 발생 원인 : xxx 근처에 변수 선언이 잘못되어있거나 예약어로 변수명을 선언했을 경우

* 코드 예 : var 1 myVar : string;

* 해결책 : 변수명이 제한자 + var + 변수명의 식으로 정확히 선언되었는지,

변수명이 영문자나 $ 혹은 _ 로 시작하는지 확인

4) 1120 : Access of undefined property myButton

* 에러 레벨 : Error

* 발생 원인 : 정의되지 않은 속성, 변수명이나 id 값을 참조하려고 할 때

* 코드 예 : <mx : Button id = "myButn" label = "확인">

<mx : Label text = "{myButton.label}"/>

5) 1084 : Rightbrace 가 end of program 앞에 있어야 한다.

* 에러 레벨 : Error

* 발생 원인 : 코드 블록 {와} 표시가 제대로 열고 닫히지 않았을때

* 해결책 : 모든 괄호가 짝지어 있는지 확인한다.

6) 1087 : 프로그램 종료 이후에 문자가 추가로 발견 되었습니다.

* 에러 레벨 : Error

* 발생원인 : 함수 선언 다음에 { 표시가 없을때

* 해결책 : 모든 괄호가 짝지어 있는지 확인한다.

7) 1008 : Variable i 에 형식 선언이 없습니다.

* 에러 레벨 : warning

* 발생 원인 : 실행문 안에 변수의 타입이 선언이 되지 않았을 때

* 코드 예 : for (var i=0; i<1; i++)

* 해결책 : 타입을 선언해 준다. for (var i : int =0; i<1; i++)

8) The end - tag for element type "mx:Mode *" must end with a '>' delimiter

* 에러 레벨 : Error

* 발생 원인 : 태그가 정확히 열고 닫히지 않았을때

* 해결책 : 태그가 제대로 열고 닫혔는지 확인한다.

9) Encountered "<mx:Model>" at line 41, column5. Was expecting one of : /Model....

* 에러 레벨 : Error

* 발생 원인 : 태그가 정확히 열고 닫히지 않았을때

* 해결책 : 태그가 제대로 열고 닫혔는지 확인한다 ( 특히 종료 태그를 빼먹지는 않았는지 확인)

10) The element type "mx:Model: must ne terminated by the matching end-tag "</mx:Model>"

* 에러 레벨 : Error

* 발생 원인 : 태그가 정확히 열고 닫히지 않았을때

* 해결책 : 태그가 동일한 이름으로 열고 닫혔는지 확인한다.

11) invalid character or markup for found in script block. Try surrounding your code with a CDATA block.

* 에러 레벨 : Error

* 발생 원인 : 태그기호 " < " 가 하나 더 있을떄

* 코드 예 : <mx:Model> .... <</mx:model>

* 해결책 : 추가된 " < " 를 찾아서 제거 한다.

12) Encounterd " > \n " at line41, column16.

* 에러 레벨 : Error

* 발생 원인 : xorm rlgh " > " 가 하나 더 있을 때

* 코드 예 : <mx:Model> .... </mx:model>>

* 해결책 : 추가된 " > "를 찾아서 제거 한다.

13) 1120 : Access of undefined property "클래스명"

* 에러 레벨 : Error

* 발생 원인 : 에러메시지에 나오는 클래스명을 import 하지 않았을 떄

* 코드 예 : ArrayUtil.toArray (myXML.result)

* 해결책 : import mx.utils.ArrayUtil ; //문장을 스크립트 블록에 써줌

14) 1061 : 정의되지 ㅇ낳은 메소드 입니다.

* 에러 레벨 : Error

* 발생 원인 : 에러 라인의 객체에서 정의되어있지 않은 메소드를 호출 하려고 할 때

* 코드 예 : Arrayutil.toArrya 2 (myXML.result)

* 해결책 : 코드ㅡ 자동완성 기능이나 API 문서를 통해 그 클래스에서 사용가능한 정확한 메소드 명을 찾아서 정의함

15) Cannot resolve attribute 'titles' for component type mx.containers.Panel.

* 에러 레벨 : Error

* 발생 원인 : 에러라인의 객체에서 정의도어있지 않은 속성을 사용하려고 할 때

* 코드 예 : <mx : Panel titles = "Line Chart ">

* 해결책 : 코드 자동완성 기능이나 API 문서를 통해 그 클래스에서 사용가능한 정확한 속성명을 찾아서 정의함

16 ) Open quote is expected for attribute "title"

* 에러 레벨 : Error

* 발생 원인 : 에러라인의 태그에서 속성값의 시작 따옴표가 정의 되지 않았을 때

* 코드 예 : <mx : panel titles = Line Chart"> or <mx : panel titles = 'Line Chart">

* 해결책 : 속성값의 따옴표를 정확히 입력한다.

18) 1071 : 속성 뒤에 주석 사용이 가능한 지시문이 있어야 합니다.

* 에러 레벨 : Error

* 발생 원인 : 에러라인의 변수 선언이 제대로 되지 않았을 때

* 코드 예 : private; private var myVar : String;

* 해결책 : 해당라인 근처의 변수 선언을 정확히 해준다.

19) 1180 : Call to a possibly undefined method check.

* 에러 레벨 : Error

* 발생 원인 : 정의되지 않은 메소드를 호출하려고 할 떄

* 코드 예 : check ();

* 해결책 : 해당 함수를 호출하는 라인으로 가서 정확한 메소드명으로 고쳐준다.

20) 1084 : rightparen 이 콜론 " : " 앞에 있어야 합ㄴ디ㅏ.

* 에러 레벨 : Error

* 발생 원인 : " : " 근처에서 객체 관련 코드가 잘못 되었을 때 / var, function 등의 키워드를 설정하지 않았을 떄

* 코드 예 : <mx : Button label = "확인 " click = "showMenu(event:Event) " />

*해결책 : 클래스 타입 선언을 제거한다.

21) Data binding will not be able to detect assignments to :bindableVar"

* 에러 레벨 : Warning

* 발생 원인 : 변수가 바인딩 되어 있는데 [bindable] 표시를 하지 않아 발생

* 코드 예 : private var bindableVar : Number=0;

* 해결책 : 바인딩하는 변수를 찾아서 [bindable] private var bindableVar : Number=0; 표시를 해준다.

22) 다음 형식 주석이 컴파일 타입 상수가 아닙니다.

* 에러 레벨 : Error

* 발생 원인 : 컴피일 중에 참조하려는 객체나 속성이 없을때

* 코드 예 : 객체으 ㅣ이름이나 속성이 잘못 되었거나 import 문을 써주지 않았을 때

* 해결책 : 에러가 발ㄹ생한 객체를 찾아서 import 문, 클래스며으, 속성명 등이 정확한지 확인한다.

23 ) int가 관련없는 String 형식으로 암시적 강제 정의 되어있습니다.

* 에러 레벨 : Error

* 발생 원인 : 객체에 값을 설정하려고 하는데 타입이 맞지 않을 때

* 코드 예 : var test : String = "test"; test =1;

* 해결책 : 에러가 발생한 코드를 찾아서 세팅되는 객체의 타입을 맞게 수정해 준다 / test = "1";

24) Definition sub : SubClass could not be found .

* 에러 레벨 : Error

* 발생 원인 : 특정 패키지에 있는 클래스를 찾을 수 없을 때

* 코드 예 : import sub.subclass

* 해결책 : SubClass 에 대한 패키지명, 경로, 클래스명이 정확한지 확인한다.

25) ReferenceError : Error #1069 : String 에서 속성을 찾을 수 없습니다. 기본값이 없습니다.

* 에러 레벨 : Error

* 발생 원인 : 데이터 바인딩을 위해 데이터를 참조하려고 하는데 그 속성명이 없거나, 데이터 바인딩이 되지 않았을 때

* 코드 예 : <mx:LineChart dataProvider = "myAC } " 또는 showDataTips = true">

혹은 데이터 정의가 <apple> 100 </apple> 식으로 되어 있을때

26) typeError : Error #1009 : null 객체 참조의 속성이나 메소드에 액세스 할 수 없습니다.

* 에러 레벨 : Error (Runtime Exception)

* 발생 원인 : 실행중에 참조하려는 객체 속성이나 메소드가 없을때

* 코드 예 : mx.controls.Alert.show (event.result.xxx) ;

* 해결책 : 참조하려는 객체의 정확한 속성명이나 메소드명을 써 준다.

출처: http://blog.naver.com/PostView.nhn?blogId=injae0203&logNo=70071061714

Posted by 1010
반응형

출처 : http://blog.hanb.co.kr/100


오라일리(O'Reilly) InsideRia에 20회에 걸쳐 연재되었던 Tony Hiller의 Anatomy of an Enterprise Flex RIA가 드디어 한국어 번역이 완료되었습니다. 최근에 RIA(Rich Internet Application)와 Flex에 대한 관심이 많아지고 있는것 같습니다. 웹페이지를 마치 응용 프로그램 처럼 구현할수도 있고, 비디오, 오디오 등 다양한 매체들을 손쉽게 표현할 수 있다는게 장점이 아닌가 합니다.

아래 번역 기사들은 많은 한빛미디어 독자분들이 직접 번역해서 한빛 네트워크에 등록한 것입니다. 이 자리를 빌어 번역에 참여해 주신 독자분들께 감사드립니다.

RiA나 Flex 관련 서적들도 출간되었고, 앞으로도 많은 서적들이 출간될 거라 예상하지만, 아래 기사만으로도 충분히 Flex RIA를 시작하는데 좋은 자료가 될 것 같습니다 :)

Enterprise Flex RIA 해부

Posted by 1010
반응형

1. ComboBox ItemRenderer

< ?xml version="1.0" encoding="utf-8"?>
< mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="450" height="370"
verticalScrollPolicy="off" horizontalScrollPolicy="off" backgroundColor="#FFFFFF">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable] public var initDG:ArrayCollection = new ArrayCollection([
{no:0, isChecked:"N"},
{no:1, isChecked:"Y"},
{no:2, isChecked:"N"},
{no:3, isChecked:"N"},
{no:4, isChecked:"Y"}]);
]]>
</mx:Script>
<mx:DataGrid id="myGrid" dataProvider="{initDG}" width="450" height="300" editable="false">
<mx:columns>
<mx:DataGridColumn headerText="no" dataField="no" width="150"/>
<mx:DataGridColumn headerText="isChecked" dataField="isChecked" width="150"/>
<mx:DataGridColumn dataField="isChecked" headerText="itemRenderer">
<mx:itemRenderer>
<mx:Component>
<mx:ComboBox selectedIndex="{data.isChecked=='Y'? 0:1}">
<mx:dataProvider>
<mx:Object label="Y" data="Y"/>
<mx:Object label="N" data="N"/>
</mx:dataProvider>
</mx:ComboBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
< /mx:Application>

2. CheckBox ItemRenderer
< ?xml version="1.0" encoding="utf-8"?>
< mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="450" height="370"
verticalScrollPolicy="off" horizontalScrollPolicy="off" backgroundColor="#FFFFFF">
<mx:Style>
global { font-size:12}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable] public var initDG:ArrayCollection = new ArrayCollection([
new RendererVO2(0, "N"),
new RendererVO2(1, "Y"),
new RendererVO2(2, "N"),
new RendererVO2(3, "N"),
new RendererVO2(4, "Y")]);
private var flag:Boolean = false;
private function checkAll():void {
if(flag) {
flag = false;
} else {
flag = true;
}
for(var idx:uint=0; idx<initDG.length; idx++) {
initDG[idx] = new RendererVO(idx, flag ? "Y" : "N");
}
}
]]>
</mx:Script>
<mx:DataGrid id="myGrid" dataProvider="{initDG}" width="450" height="150" editable="false">
<mx:columns>
<mx:DataGridColumn headerText="no" dataField="no" width="150"/>
<mx:DataGridColumn headerText="isChecked" dataField="isChecked" width="150"/>
<mx:DataGridColumn dataField="isChecked" headerText="itemRenderer">
<mx:itemRenderer>
<mx:Component>
<mx:CheckBox click="changeVO(event)">
<mx:Script>
<![CDATA[
[Bindable] private var rdVO:RendererVO2;
override public function set data(value:Object):void {
rdVO = RendererVO2(value);
if(value.isChecked == "Y") {
this.selected = true;
} else {
this.selected = false;
}
}
private function changeVO(event:Event):void {
trace(event.target.selected ? "Y" : "N");
var parentObj:Object = event.target.parentApplication;
parentObj.initDG[rdVO.no] = new RendererVO2(rdVO.no, event.target.selected ? "Y" : "N");
}
]]>
</mx:Script>
</mx:CheckBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
<mx:Button label="전체선택/해제" click="checkAll()"/>
< /mx:Application>

###파일명 RendererVO2.as
package {
public class RendererVO2 {
[Bindable] public var no:Number;
[Bindable] public var isChecked:String;
public function RendererVO2(p_no:Number, p_isChecked:String) {
this.no = p_no;
this.isChecked = p_isChecked;
}
}
Posted by 1010
반응형
Posted by 1010
반응형
 
flash builder4.5 Plug-in for eclipse(이클립스에 플래시빌더4.5 플러그인 설치법)

1. JRE(Java Runtime Environment, Java 런타임 실행 소프트웨어) 설치

http://www.java.com/ko/download/windows_ie.jsp?locale=ko

or

JDK(Java Development Kit) SE 버전 설치(JRE설치후 이클립스 실행시 에러가 나면 JDK설치)

http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u25-download-346242.html

2. eclipse 3.6.1(Helios)이상 설치, 3.6.2 권장

Eclipse IDE for Java Developers(standard버전), Eclipse IDE for Java EE Developers(enterprise버전, 웹용플러그인 같이설치됨, 권장),

Eclipse Classic 3.6.2(플러그인없이 설치됨)

3. Flash Builder 4.5 설치

standalone으로 설치한후 플러그인으로 변경합니다.

https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash_builder

All downloads can be installed as a standalone version if you do not have Eclipse™ already installed or as a plug-in version if you do. See the release notes to learn how to install the Flash Builder 4.5 trial as a plug-in

이클립스가 없으면 standalone으로 설치되고 있으면 플러그인으로 설치됩니다.

Flash Builder 4.5가 설치된 경로로 가서 utilities폴더안의 Adobe Flash Builder 4.5 Plug-in Utility.exe실행

Flash Builder 4.5 설치경로 지정, 이클립스 폴더 지정(주의사항 : 이클립스버전은 3.6.1이상 32bit, dropins폴더를 포함하고 있어야합니다)

4. eclipse.ini 수정

-vmargs -Xms256m -Xmx512m -XX:MaxPermSize=256m -XX:PermSize=64m 추가

/==================flash builder 설치후 이클립스 메뉴가 한글로 바뀔때 영문으로 바꾸는 방법=====================/

이클립스가 설치된 경로에서 eclipse.ini를 수정합니다.

-vmargs 아래에 사용할 언어추가
-Duser.language=en
-Duser.country=US

-Duser.language=ko
-Duser.country=KR

위는 영문 아래는 한글메뉴가 나오겠죠

Posted by 1010
반응형

텍스트 큐브에 문제가 발생하여 제로보드로 옮기게 되었습니다. 그리고 아직 책을 쓰고 있어서 다음 강의를 진행하지 못하고 있습니다. 양해 바랍니다.

교재: Adobe Flex 3 실전 트레이닝 북 (번역서), Adobe Press

  • 원제: Adobe Flex 3 Training from the source
  • 지은이: 제프 태퍼, 마이클  라브리올라, 매튜 볼스, 제임스 탤벗
  • 옮긴이: 신호승(ACC멤버), 정선우(ACC멤버), 이원영
  • 출판사: 위키북스

개요

이 책은 실전 예제를 통해 단계적으로 Flex 3를 배울수 있도록 구성되어 있습니다. 온라인 식료품점을 만들어 가면서 Flex 3의 여러 특징들을 배우고 익힐 수 있습니다. 각 단계 별로 완성된 소스코드를 제공하기 때문에, 본인이 익히고자하는 부분에서 바로 시작할 수도 있습니다.

Flex 3를 처음 접하는 분들께 좋은 책이라 생각됩니다. 이 책을 처음부터 끝까지 한번 따라해보세요. Flex 3 기술 전반에 대해 이해할 수 있습니다. 또한, Flex Builder 툴 사용법도 자연스럽게 익힐 수 있습니다. 당장 Flex 프로젝트를 해야하는 개발자 분들께도 적극 추천합니다.

목차

* 동영상 강의는 "판도라TV"와 "Vimeo.com" 두 곳에 올려 놓았습니다. 두 곳 모두 HD 입니다.
* 판도라TV의 경우 [전체화면보기]에서 동영상 화면이 좀 거칠어 보이면, 화면에서 오른쪽 버튼을 클릭하여 부메뉴를 띄운 다음 [HD 부드럽게 처리하기] 를 선택하시면 됩니다.
* Firefox 또는 IE에서 [CTRL] + [-] 누르면 화면이 작아지고, [CTRL] + [=] 누르면 화면이 커집니다. 전체화면 보기를 하시거나 이런 방식으로 화면을 크게해서 보시면 됩니다.


출처 : http://www.eomjinyoung.com/xe/?mid=board&category=107&document_srl=114

Posted by 1010
반응형
출처 : http://www.7zelkova.pe.kr/704

eclipse의 새 버전 Galileo가 지난 6월 정식 릴리즈됐다.
이번에 컴퓨터 포맷하면서 전에 쓰던 Ganymede를 삭제하고 Galileo로 갈아탔다.

그런데 문제는 Flex Builder가 설치는 되는데 eclipse 에서 Flex Development Perspective가 안뜬다는 것!!
이거 왜 이래!! 무서워...

신버전을 사용하는 것의 무서움을 다시금 깨닫게 되었다.
뭐. 그래도 방법이 있겠지. 구글링을 시작했다.

오호~ Galileo에서 Flex Builder 적용 성공한 사람들의 이야기가 많이 나왔는데 왜 다 리눅스냐...ㅡ_ㅡ)
주욱 읽다보니 드디어 내가 원하는 windows에서의 적용 예가 나왔다.

영어로 되어있고, 그에 대한 설명과 해결법이 나와있는데 나 역시 대한민국 국민이기에 해결법만 찾아봤다.
해결법은 생각보다 매우 간단했다.


1. eclipse 가 설치(압축해제) 되어있는 폴더로 간다.
2. links 폴더로 간다. (없으면 하나 생성)
3. com.adobe.flexbuilder.feature.core.link 파일을 텍스트 에디터로 연다. (없으면 하나 생성)
4. 내용을 path=C:/Dev/Adobe/Flex Builder 3 Plug-in 으로 해준다 (Flex Builder Plug-in 파일들이 설치된 폴더 경로)
5. eclipse를 켜고 Window > Open Perspective > Other 에서 Flex Development 를 선택한다.
Posted by 1010
반응형
플렉스 개요 - 동영상
Adobe Flex 2 - 한글
--examples
--Designing Flex 2 skins with Flash, Photoshop, or Fireworks
--sample sites
Posted by 1010
반응형

http://labs.adobe.com/wiki/index.php/Flex_3:Applications#Dashboard

FLEX 3.0 예제 샘플 DashBoard ---> 유용하게 써먹을 수 있을 것 같다

http://flex.org/components/ ->역시 유용
http://www.alex-uhlmann.de/flash/adobe/blog/distortionEffects/effectCube/ -> open source effect Good~
Posted by 1010
반응형

Flex의 Visual Component(Box, Button, Application 등)은 기본적으로 UIComponent를 extends(상속)하여 만들어진다.

화면에 보여지는 컴포넌트라면 UIComponent를 extends하여 만들 것을 추천한다.

왜냐하면 기본적으로 잘 정리된 라이프 사이클(Life Cycle)로 구성되어 있어서 이를 잘 이용하면 쉽게 컴포넌트 하나를 만드는데 어려움이 없기 때문이다. 하지만 만약 개발자가 UIComponent에서 기본적으로 제공하는 라이프 사이클을 커스터마이징(Customize - 개인 또는 고객이 입맛에 맞게 만드는 것)해야 한다면 UIComponent가 아닌 Sprite나 DisplayObject를 extends하여 만들면 된다. 하지만 이때는 개발자가 많은 일을 해야한다.
(Naver Cafe FlexComponent 차카게님의 댓글 인용)

참고로 UIComponent는 다음과 같은 Class를 상속받아 만들어졌다.

UIComponent Inheritance FlexSprite Inheritance Sprite Inheritance DisplayObjectContainer Inheritance InteractiveObject Inheritance DisplayObject Inheritance EventDispatcher Inheritance Object

출처 : http://flexdocs.kr/docs/flex2/langref/m ··· ent.html

여기에 SpriteDisplayObject가 있다는 것을 확인하길 바란다. 참고로 각종 Event를 Dispatch(송출)해야하므로 EventDispatcher를 extends했다는 것도 확인할 수 있다.

이 글은 비주얼 컴포넌트가 기동시에 Event 및 method가 실행되는 시점을 분석하여 컴포넌트의 라이브 사이클을 알아내고 확장컴포넌트를 만드는데 필요한 지식을 얻는 것을 목표로 하고 있다.


1. 컴포넌트 기동시 송출(dispatch)되는 Event 분석


UIComponent 및 UIComponent를 extends한 컴포넌트는 기동시 아래와 같은 이벤트를 송출한다.

사용자 삽입 이미지

그림 1


이를 확인하기 위해 아래와 같은 코드로 확인해볼 수 있다.

ExLifeCycle.mxml (Language : xml)
<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    preinitialize="traceEvent(event)"
    initialize="traceEvent(event)"
    creationComplete="traceEvent(event)"
    updateComplete="traceEvent(event)">

    <mx:Script>
        <![CDATA[
            private function traceEvent(event:Event):void
            {
                trace(event.currentTarget + " - " + event.type );
            }
        ]]>

    </mx:Script>
</mx:Application>

결과는 Debug모드에 Console 창에서 아래와 같이 나온다.
ExLifeCycle0 - preinitialize
ExLifeCycle0 - initialize
ExLifeCycle0 - creationComplete
ExLifeCycle0 - updateComplete
그럼 각 이벤트에 대해서 간단하게 설명하겠다.
  1. preinitialize - UIComponent에 정의된 initialize() 메소드가 호출되면 preinitialize 이벤트를 송출한다. 개발자가 내부구조를 작성하기 전에 컴포넌트를 변경하고 싶을때 preinitialize 이벤트에 대한 Listener를 작성해서 사용한다. 말그대로 가장 최초에 해야할 작업이 있을때 사용하면 된다.
    참고로 initialize() 메소드는 컴포넌트의 부모의 addChild() 및 addChildAt() 메소드을 통해 자식으로 등록이 될 때 자동적으로 호출되는 함수이다. initialize() 메소드에 대한 자세한 내용은 http://flexdocs.kr/docs/flex2/langref/m ··· itialize 를 참고한다.
  2. initialize - UIComponent의 initialize()메소드에서 내부적으로 처리해야하는 사항들(자식만들기,속성값정의,사이즈정의,그림그리기등)을 모두 처리할 수 있도록 한 뒤 initialize 이벤트를 송출한다. 컴포넌트의 레이아웃전에 추가 처리가 필요한 경우 이 이벤트를 사용한다.
  3. creationComplete - 컴포넌트 구축, 속성처리, 측정, 레이아웃 및 그림그리기가 모두 완료되었을때 송출된다. 이 이벤트는 컴포넌트 생성시 단 한번만 호출된다.
  4. updateComplete - 내부적으로 commitProperties(), measure(), updateDisplayList() 메소드을 호출함으로 인해 컴포넌트의 레이아웃, 위치, 사이즈등의 시각적 특징이 변경되어 컴포넌트의 화면상 모습이 갱신될때마다 송출된다.
이 이벤트들의 특성을 잘 파악하고 쓸 필요가 있다. 만약 Button컴포넌트를 생성되기도 전에 width와 height를 참고할려고 하면 그 값은 모두 0인 경우가 있다. 이런 경우에는 creationComplete 이벤트를 받아 처리하면 쉽게 해결할 수 있을것이다. 또 버튼이 그려지기 전에 동적으로 값을 설정할 필요가 있는 경우 preinitialize 이벤트를 받아 처리한다. 물론 Button 조차 동적으로 생성하는 경우에는 부모에 addChild()함수등으로 인해 자식으로 포함되기전 관련 작업을 해도 되겠다. 왜냐하면 addChild한 뒤에 initialize()함수가 호출이 되기 때문이다.


2. 컨테이너와 자식 컴포넌트 기동시 Event 송출 흐름 분석

여기서 말하는 컨테이너는 Application, Canvas, Box등이 그것이다. 자식으로 Component는 Button, ComboBox등이 되겠다. 아래 그림을 보자. 그림은 컨테이너가 자식컴포넌트를 가질때 발생하는 Event에 대해 잘 묘사하고 있다.

사용자 삽입 이미지

그림 2. 컨테이너에 속한 라이프사이클중에 Dispatch(송출)되는 주요 이벤트


전체적인 흐름은 그림 1 과 다른 것이 없다. 추가 및 변경 되는 사항은 컨테이너에 childAdd Event가 추가되었다는 것과 부모와 자식간에 Event 송출시점이 다르다는 점이다. 이런 Event흐름을 가질 수 밖에 없는 것은 앞에서 Event의 특성을 생각해보면 쉽게 유추할 수 있다. 참고로 만약 컨테이너가 Application인 경우엔 마지막에 applicationComplete Event가 송출된다.

다음은 위의 이벤트 흐름을 확인하기 위한 예제 코드이다.
(FlexComponent카페 브라이언님의 예제를 참고하였다. http://cafe.naver.com/flexcomponent/1200)

ExLifeCycle.mxml (Language : xml)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    add="traceEvent(event)"
    added="traceEvent(event)"
    preinitialize="traceEvent(event)"
    initialize="traceEvent(event)"
    childAdd="traceEvent(event)"
    creationComplete="traceEvent(event)"
    updateComplete="traceEvent(event)"
    applicationComplete="traceEvent(event)">

    <mx:Script>
        <![CDATA[
            private function traceEvent(event:Event):void
            {
                trace(event.type+"("+ event.eventPhase + ") " + event.currentTarget.name + " " + event.target.name + "   " + event.target.parent.name  );
            }
        ]]>

    </mx:Script>
    <mx:Button id="button"
            add="traceEvent(event)"
            added="traceEvent(event)"
            preinitialize="traceEvent(event)"
            initialize="traceEvent(event)"
            creationComplete="traceEvent(event);"
            updateComplete="traceEvent(event)"/>

</mx:Application>


결과는 Debug모드에서 실행하면 Console 창에서 아래와 같이 확인할 수 있다.
이벤트 Type(Phase) currentTarget target target.parent
added(3) ExLifeCycle0 border ExLifeCycle0
add(2) ExLifeCycle0 ExLifeCycle0 root1
preinitialize(2) ExLifeCycle0 ExLifeCycle0 root1
added(2) button button ExLifeCycle0
added(3) ExLifeCycle0 button ExLifeCycle0
childAdd(2) ExLifeCycle0 ExLifeCycle0 root1
add(2) button button ExLifeCycle0
preinitialize(2) button button ExLifeCycle0
added(3) button UITextField5 button
added(3) ExLifeCycle0 UITextField5 button
initialize(2) button button ExLifeCycle0
initialize(2) ExLifeCycle0 ExLifeCycle0 root1
added(3) button upSkin button
added(3) ExLifeCycle0 upSkin button
added(3) ExLifeCycle0 backgroundMask ExLifeCycle0
added(3) ExLifeCycle0 ApplicationBackground7 ExLifeCycle0
creationComplete(2) button button ExLifeCycle0
updateComplete(2) button button ExLifeCycle0
creationComplete(2) ExLifeCycle0 ExLifeCycle0 root1
added(2) ExLifeCycle0 ExLifeCycle0 root1
applicationComplete(2) ExLifeCycle0 ExLifeCycle0 root1
updateComplete(2) ExLifeCycle0 ExLifeCycle0 root1
Phase
(위상-이벤트흐름단계)
1 : Capture단계
2 : target단계
3 : bubble 단계


아래 그림 3은 위 프로그램의 부모 자식관계를 표현하고 있다. 우리는 인위적으로 Application에 button만 컴포넌트로 추가했다. 하지만 target을 보면 Application은 child로 border, backgroundMask, ApplicationBackground를 가지는 것과 button은 child로 UITextField와 upSkin을 가진다는 것을 확인할 수 있다. 위의 결과에서 added Event와 add Event만 뺀다면 그림 2 에서 보여준 Event 흐름과 다를 바 없다는 것을 확인할 수 있다.

사용자 삽입 이미지

그림 3. parent와 child관계

여기서 Event Listener를 Application과 Button에 만들었다. 다른 Event들과 다르게 added Event가 발생할 때는 자신 및 부모 컴포넌트에게도 Event가 전파되는 것을 확인할 수 있다. 즉, 부모컴포넌트인 button에 UITextField와 upSkin에서 발생한 added Event가 전파된다는 말이다. 이는 added Event송출시에 Event의 bubbles 인자가 true이기 때문이다. 구체적으로 설명하면 dispatchEvent( new Event( "added", true, false )) 형태로 Event의 2번째 인자를 true 로 설정해서 Event를 송출(Dispatch)한다. 그러므로 이벤트가 target단계뿐 아니라 bubble단계로 전파가 된다.

더욱 구체적인 살펴보기 위해, 위 결과에서 분홍색표시된 부분을 보자. button의 자식 컴포넌트인 UITextField는 added Event를 송출한다. added Event는 bubble단계도 전파하므로 target는 항상 UITextField이고 bubble(3)단계에서 UITextField의 부모인 button이 이 added Event를 listen하고 있으므로 currentTarget이 button일때 traceEvent()를 메소드를 실행하는 것을 볼 수 있다. 또 button의 부모인 Application에서도 added Event를 Listen하고 있으므로 currentTarget이 ExLifeCycle일때 traceEvent() 메소드를 실행하게 된다.

이것을 명확하게 이해하기 위해서는 currentTarget과 target이 뜻과 이벤트 전파방법(capture, target, bubble 단계)에 대해서 정확히 이해할 필요가 있다.
이벤트 전파에 관해서는 이벤트 전파(http://flexdocs.kr/docs/flex2/docs/00000475.html)를 참고한다.

아래 그림은 위 결과를 보기 쉽게 그림으로 표현한 것이다.
사용자 삽입 이미지

그림 4. 이벤트 전파 다이어그램




그럼, 여기서 새로 나온 Event인 add, added, childAdd 이벤트에 대해서 간단히 소개한다.

  1. add : Container.addChild(), Container.addChildAt()를 사용해서 컨테이너에 자식이 추가 될 때, mx.events.FlexEvent 객체 생성
  2. added : DisplayObjectContainer.addChild(), DisplacyObjectContainer.addChildAt() 을 사용해서 컨테이너에 자식이 추가될 때 flash.events.Event 객체 생성
  3. childAdd : addChild(), addChildAt()을 사용해서 자기 하위로 자식이 추가 완료되었을 때, 부모가 자식이 잘 추가되었는지 확인하기 위해 이 이벤트로 확인이 가능하다. mx.events.ChildExistenceChangedEvent 객체 생성


3. 비주얼 컴포넌트의 확장에 대해


이미 언급했듯이 대부분의 비주얼 컴포넌트가 UIComponent를 확장해서 만들었으므로 UIComponent가 기본적으로 어떤 순서에 의해 메소드가 호출되고 이벤트가 발생하는지 알아야, 이미 만들어진 컴포넌트(Button등)를 분석할 수 있고 더 나아가 확장한 고급 컴포넌트를 만드는데 도움이 될 것이라 생각한다. UIComponent를 확장한 컨테이너 및 컴포넌트의 Event 흐름은 이미 언급했으므로 이제는 관련 메소드를 언급할 차례이다.

UIComponent를 extends한 가장 간단한 컴포넌트는 다음과 같다.

MyComp.as (Language : java)
package
{
    import mx.core.UIComponent;

    public class MyComp extends UIComponent
    {
        public function MyComp()
        {
            trace("MyComp 생성자 호출");
        }
    }
}

이러한 형태는 UIComponet일 수 있고 이미 UIComponent를 extends해서 만든 Button, Box등을 extends해도 된다.

UIComponent는 이미 생성순서에 맞게 호출하거나 중간중간 새로운속성, 사이즈조정, 화면표시에 대해 작업할 수 있도록 재정의(override)가 가능한 메소드가 만들어져 있다. 이러한 메소드들을 직접호출하지 않는다.

대표적인 메소드는 다음과 같다.

  • commitProperties() : 컴포넌트의 속성(properties)를 일괄적으로 조정할 필요가 있을 때 사용한다.  addChild에 의해 부모에 추가되었을 때와 invalidateProperties() 메소드를 호출할때 자동적으로 실행된다. 만약 getter나 setter에 의해 설정된 속성들을 이 commitProperties()에서 처리할 수 있도록 하면 width와 height 또는 horizontalScrollPolicy와 horizontalScrollPosition과 같이 서로 연관성있는 속성을 한꺼번에 처리하여 작업의 중복을 무시할 수 있도록 만들 수 있다. 구현방법에 대해서는 commitProperties()메소드의 구현을 참고한다.
  • createChildren() : 컴포넌트에 다른 자식 컴포넌트를 addChild할 경우에 사용한다. 가령 새로 작성되는 컴포넌트에 자식 컴포넌트로 ComboBox와 TextInput를 사용해야한다면 이 메소드를 재정의하여 그 안에서 addChild 한다. 이 메소드는 컴포넌트가 parent에서 addChild할때 단 한번 호출된다. 구현방법은 createChildren() 메소드의 구현을 참고한다.
  • layoutChrome() : 이 메소드는 UIComponet를 extends한 Container에 정의된 메소드이다. 컨테이너의 경계선의 위치 및 사이즈를 설정할때 사용된다. addChild에 의해 parent에 추가되었을때와 invalidateDisplayList() 메소드를 실행시 호출되는 메소드이다. 상세한 내용은 layoutChrome() 메소드의 구현을 참조한다.
  • measure() : 컴포넌트의 default 폭과 높이, default 최소 폭과 높이를 설정할 경우 사용한다. 이 메소드를 이용하면 가령, 컴포넌트에서 표시에 필요한 텍스트 양, fontSize등에 의한 텍스트 스타일, 컴포턴트에 표시되는 이미지 사이즈, 컴포넌트의 Child측정 사이즈 또는 명시적 사이즈, 모든 경계선 및 간격 등을 계산하여 적절한 사이즈를 선택해 적용이 가능하다. 기본적으로 parent에서 addChild할때와 invalidateSize()메소드를 실행하며 호출된다. 상세한 것에 대하여는,measure() 메소드의 구현을 참조한다.
  • updateDisplayList() : 앞서 지정된 속성 및 스타일 설정에 근거하여 화면상에 자식 컴포넌트의 배치 및 사이즈를 조절하고 각종 스킨 및 그래픽을 묘사하는데 사용한다. 가령, 컴포넌트에 자식 컴포넌트가 있는 경우 이 메소드에서 move() 및 setActualSize() 메소드등을 호출하여 배치나 사이즈 조정을 한다. 또, 자식 컴포넌트가 없는 경우 graphic.drawRect()와 같은 메소드를 이용해 그림을 그릴 수 있다. 사이즈의 경우 width, height대신 인자로 넘어온 unscaledWidth와 unscaledHeight를 이용한다. addChild에 의해 parent에 추가되었을때와 invalidateDisplayList() 메소드를 실행시 호출된다. 상세한 것에 대하여는,updateDisplayList() 메소드의 구현을 참고한다.
위에서 메소드들을 살펴보았듯이 확장 컴포넌트를 만들때 필요에 따라 적절히 위 메소드들을 재정의해서 사용하는 것이 중요하겠다. 관련된 예제는 ModalText 컴포넌트의 작성을 참고한다.


4. 메소드 및 Event로 본 컴포넌트의 라이브 사이클

그럼 본래 목적으로 넘어오자. 앞서 Event의 발생순서와 비주얼 컴포넌트에서 제공하는 재정의 가능한 메소드를 설명했다. 각각의 호출되는 시점과 그 때 발생하는 Event를 확인해 보도록 하겠다.

먼저 Application과 Button 확장하여 아래와 같이 위에서 제시한 메소드들을 전부 재정의한다. 재정의된 메소드 내에는 언제 메소드가 호출되는지 확인하기 위해 trace()를 사용한다.

MyApplication.as (Language : java)
package
{
    import mx.core.Application;

    public class MyApplication extends Application
    {
        public function MyApplication()
        {
            trace("    MyApplication Constructor()");
        }
       
        override public function initialize():void
        {
            trace("    MyApplication initialize()");
            super.initialize();
        }
       
        override protected function createChildren():void
        {
            trace("    MyApplication createChildren()");
            super.createChildren();
        }
       
        override protected function commitProperties():void
        {
            trace("    MyApplication createProperties()");
            super.commitProperties();
        }
       
        override protected function measure():void
        {
            trace("    MyApplication measure()");
            super.measure();
        }
       
        override protected function layoutChrome(unscaledWidth:Number, unscaledHeight:Number):void
        {
            trace("    MyApplication layoutChrome()");
            super.layoutChrome(unscaledWidth, unscaledHeight);
        }
       
        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
            trace("    MyApplication updateDisplayList()");
            super.updateDisplayList(unscaledWidth, unscaledHeight);
        }      
    }
}


MyButton.as (Language : java)
package
{
    import mx.controls.Button;

    public class MyButton extends Button
    {
        public function MyButton()
        {
            trace("    MyButton Constructor()");
        }

        override public function initialize():void
        {
            trace("    MyButton initialize()");
            super.initialize();
        }
       
        override protected function createChildren():void
        {
            trace("    MyButton createChildren()");
            super.createChildren();
        }
       
        override protected function commitProperties():void
        {
            trace("    MyButton createProperties()");
            super.commitProperties();
        }
       
        override protected function measure():void
        {
            trace("    MyButton measure()");
            super.measure();
        }
       
        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
            trace("    MyButton updateDisplayList()");
            super.updateDisplayList(unscaledWidth, unscaledHeight);
        }      
    }
}

위에서 만든 두개의 컴포넌트를 아래와 같이 사용한다. 예전에 Application과 Button대신 새로 정의한 컴포넌트인 MyApplication과 MyButton을 사용한 것 밖에 다른 점이 없다.

ExLifeCycle.mxml (Language : xml)
<?xml version="1.0" encoding="utf-8"?>
<local:MyApplication
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:local="*"
    layout="absolute"
    add="traceEvent(event)"
    added="traceEvent(event)"
    preinitialize="traceEvent(event)"
    initialize="traceEvent(event)"
    childAdd="traceEvent(event)"
    creationComplete="traceEvent(event)"
    updateComplete="traceEvent(event)"
    applicationComplete="traceEvent(event)">
   
    <mx:Script>
        <![CDATA[
            private function traceEvent(event:Event):void
            {
                trace(event.type+"("+ event.eventPhase + ") " + event.currentTarget.name + " " + event.target.name + "    " + event.target.parent.name  );
            }
        ]]>

    </mx:Script>
    <local:MyButton id="button" label="Submit" 
                add="traceEvent(event)"
                added="traceEvent(event)"
                preinitialize="traceEvent(event)"
                initialize="traceEvent(event)"
                creationComplete="traceEvent(event)"
                updateComplete="traceEvent(event)"/>

</local:MyApplication>


 

결과는 다음과 같다.
이벤트Type(Phase) currentTarget target target.parent method
        MyApplication Constructor()
added(3) ExLifeCycle0 border ExLifeCycle0  
add(2) ExLifeCycle0 ExLifeCycle0 root1  
        MyApplication initialize()
preinitialize(2) ExLifeCycle0 ExLifeCycle0 root1  
        MyApplication createChildren()
        MyButton Constructor()
added(2) button button ExLifeCycle0  
added(3) ExLifeCycle0 button ExLifeCycle0  
childAdd(2) ExLifeCycle0 ExLifeCycle0 root1  
add(2) button button ExLifeCycle0  
        MyButton initialize()
preinitialize(2) button button ExLifeCycle0  
        MyButton createChildren()
added(3) button UITextField5 button  
added(3) ExLifeCycle0 UITextField5 button  
initialize(2) button button ExLifeCycle0  
initialize(2) ExLifeCycle0 ExLifeCycle0 root1  
        MyApplication commitProperties()
        MyButton commitProperties()
added(3) button upSkin button  
added(3) ExLifeCycle0 upSkin button  
        MyButton measure()
        MyApplication measure()
        MyApplication updateDisplayList()
        MyApplication layoutChrome()
added(3) ExLifeCycle0 backgroundMask ExLifeCycle0  
added(3) ExLifeCycle0 ApplicationBackground7 ExLifeCycle0  
        MyButton updateDisplayList()
creationComplete(2) button button ExLifeCycle0  
updateComplete(2) button button ExLifeCycle0  
creationComplete(2) ExLifeCycle0 ExLifeCycle0 root1  
added(2) ExLifeCycle0 ExLifeCycle0 root1  
applicationComplete(2) ExLifeCycle0 ExLifeCycle0 root1  
updateComplete(2) ExLifeCycle0 ExLifeCycle0 root1  
Phase
(위상-이벤트흐름단계)
1 : Capture단계
2 : target단계
3 : bubble 단계


아래 그림은 위 결과를 보기 쉽게 다이어그램으로 표시했다.

사용자 삽입 이미지

그림 5. 이벤트 전파 및 메소드 실행 시점 다이어그램


앞서 설명했듯이 initialize() 메소드는 컴포넌트의 부모 컴포넌트가 addChild할 때에 호출되며 처음에는 preinitialize 이벤드를 송출하고 creationChildren() 메소드를 수행한 다음 initialize 이벤트를 송출한다.  부모 컴포넌트인 경우 자식을 성공적으로 add하면 childAdd 이벤트를 송출한다.

measure(), layoutChrome(), updateDisplayList() 메소드는 initialize 이벤트가 송출된 다음에 호출이 되며 이 함수들이 모두 실행한 후에 creationComplete 이벤트와 updateComplete 이벤트가 발생하는 것을 확인할 수 있다.

이에 대해 조금더 이해하기 위해 컴포넌트의 인스턴스화 라이프 사이클에 대해를 참고하면 되겠다.


정리하며

비주얼 컴포넌트의 라이브 사이클을 메소드와 이벤트를 통해 이해하고 있으면 좀더 고급적인 컴포넌트를 작성하는데 도움이 된다. 내용을 이해하는 것이 그리 쉽지는 않을 것이라 생각한다. 하지만 Flex 컴포넌트를 이해하는데 매우 중요한 개념이므로 꼭 숙지할 필요가 있다.

내용도 많고, 시간을 너무 많이 소비하는 것 같고, 귀차니즘도 몰려오고 그래서 약간 내용의 부실함 가져온 것 같다. 아래 참고글들을 잘 읽어보고 이해 안가는 내용을 조금씩 습득했으면 한다.

앞으로 이와 관련되어 좋은 글이 많이 나왔으면 한다.
Posted by 1010
반응형

Flex 3 DataGrid Footers

I took a few minutes to prove that there is another way to add Footers to DataGrid in Flex 3. The old blog post showed how to add footers to the border. In Flex 3 we added more hooks so you can add other "content areas" to the DataGrid.

I'm short on time so the example isn't fully fleshed out. It could definitely use some optimization as to when and how often it refreshes. It probably needs masking if horizontal scrollbars are on, but at least it should show up in the right place relative to the horizontal scroll bar. There's probably bugs as well, so the usual caveats apply, but it should get you started in the right direction. Also, I did not try this with AdvancedDataGrid. It is actually developed by an entirely different team.

Download Source
Run Demo

출처 : Tong - BlueSky_08님의 Flex/Flash/AIR/As통

Posted by 1010
반응형

Image Gallery Component - ImageRail

29.05.08 | 5 Comments

Table of contents

  1. Image Gallery Component - ImageRail
  2. ImageRail - Adding Click Event, Styles And HandCursor

In this article I’ll present a new component I built: ImageRail. This MXML component will display a series of thumbnails having the possibility to scroll them horizontally.

Parameters:

  • paths: an array containing URLs to images
  • images: an array containing image objects
  • imagesToShow: an unsigned integer that specifies the number of images displayed at a time - deafult is 4
  • imagesGap: an unsigned integer that specifies the gap between images - deafult is 10
  • passePartout: an unsigned integer that specifies the white padding around each image - deafult is 10
  • effect: a function that in fact is the easing function (ex: Exponential.easing) and can be one of the following each having easeIn, easeOut and easInOut - deafult is Exponential.easeOut
    • mx.effects.easing.Back
    • mx.effects.easing.Bounce
    • mx.effects.easing.Circular
    • mx.effects.easing.Cubic
    • mx.effects.easing.Elastic
    • mx.effects.easing.Exponential
    • mx.effects.easing.Linear
    • mx.effects.easing.Quadratic
    • mx.effects.easing.Quartic
    • mx.effects.easing.Quintic
    • mx.effects.easing.Sine
  • effectDuration: an unsigned integer that specifies the duration in milliseconds - deafult is 500
  • height: a number that specifies the height of the component, based on which all others measures are calculated - deafult is 120
  • width: a number that specifies the width - if it is not set imagesToShow will be used instead

First two parameters excludes one another and images array has priority over paths so if you specify both paths and images only images will be populated. If paths will be used then both arrays will be populated and the values in images array will be created based on paths array.

We will use:

  • sequence - to use more than one movement effects, but we will use only one
  • effect - our movement effect
  • canvas - component is extending canvas and used also for every image and for all images
  • image - used to display images
  • button - used for next and previous

The code is very well commented so you won’t find any problems understanding what is done there. So first lets see the component in action.


This example is a simple one. For it only height, width, gap, passePartout and effectDuration are set.

The next example is a more complex one. You can see how ImageRail’s properties are updated with the ones specified in controls.


In this example you may notice that the size of the images are calculated based on the component height and by changing its height the images are also resized.

Below you can find the code of each file (not the component because of its size) and at the end you can download all sources.

ImageRailApp.mxml - the complex application

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" creationComplete="init()" xmlns:flexer="com.flexer.*">
    <mx:VBox>
        <mx:Canvas>
            <mx:Label x="10" y="10" text="height"/>
            <mx:Label x="108" y="10" text="imagesToShow"/>
            <mx:Label x="206" y="10" text="gap"/>
            <mx:Label x="304" y="10" text="passePartout"/>
            <mx:Label x="402" y="10" text="width"/>
            <mx:Label x="10" y="56" text="effect"/>
            <mx:Label x="108" y="56" text="effectDration"/>
            <mx:NumericStepper x="10" y="26" id="cmpH" 
                value="130" minimum="90" maximum="200" width="90"/>
            <mx:NumericStepper x="108" y="26" id="picsToShow" 
                value="2" minimum="0" maximum="10" width="90"/>
            <mx:NumericStepper x="206" y="26" id="imageGap" 
                value="12" minimum="0" maximum="50" width="90"/>
            <mx:NumericStepper x="304" y="26" id="passePartout" 
                value="12" minimum="0" maximum="50" width="90"/>
            <mx:NumericStepper x="402" y="26" id="cmpW" value="500" 
                minimum="0" maximum="800" stepSize="10" width="90"/>
            <mx:ComboBox x="10" y="72" id="effect" selectedIndex="5"
                dataProvider="{easingFunctions}" width="90"/>
            <mx:NumericStepper x="108" y="72" id="effectDuration" 
                value="500" minimum="100" maximum="5000" stepSize="10" width="90"/>
        </mx:Canvas>
        <flexer:ImageRail height="{cmpH.value}" width="{cmpW.value}" 
            paths="{_paths}" gap="{imageGap.value}" imagesToShow="{picsToShow.value}" 
            passePartout="{passePartout.value}" effectDuration="{effectDuration.value}" 
            effect="{effect.selectedItem.easingClass.easeOut}"/>
    </mx:VBox>
    <mx:Script>
        <![CDATA[
            import mx.controls.Image;
            import mx.effects.easing.*;
 
            [Bindable] 
            public var easingFunctions:Array = [
                {label: "Bounce", easingClass: Bounce},
                {label: "Back", easingClass: Back},
                {label: "Circular", easingClass: Circular},
                {label: "Cubic", easingClass: Cubic},
                {label: "Elastic", easingClass: Elastic},
                {label: "Exponential", easingClass: Exponential},
                {label: "Linear", easingClass: Linear},
                {label: "Quadratic", easingClass: Quadratic},
                {label: "Quartic", easingClass: Quartic},
                {label: "Quintic", easingClass: Quintic},
                {label: "Sine", easingClass: Sine}
            ];
 
 
            [Bindable]
            private var _paths:Array = [
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/fxr-4_1280x1024.png",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/Fx{r}-4_1280x1024.png",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/AuroraDream_by_DP_Studios1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_grass_1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_hairdresser_1280x1024_h.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_hairdresser_1280x1024_v.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_friends_c2_1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/Fx{r}-4_1280x1024.png",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/AuroraDream_by_DP_Studios1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_grass_1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_hairdresser_1280x1024_h.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_friends_c2_1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_fifa_1280x1024.jpg"  
            ];
 
        ]]>
    </mx:Script>
</mx:Application>

ImageRailApp2.mxml - simpler application

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" creationComplete="init()" xmlns:flexer="com.flexer.*">
    <mx:VBox>
        <flexer:ImageRail id="ir" height="130" width="430" 
            gap="20" passePartout="24" effectDuration="700"/>
    </mx:VBox>
    <mx:Script>
        <![CDATA[
            import mx.controls.Image;
 
            [Bindable]
            private var _paths:Array = [
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/fxr-4_1280x1024.png",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/Fx{r}-4_1280x1024.png",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/AuroraDream_by_DP_Studios1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_grass_1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_hairdresser_1280x1024_h.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_hairdresser_1280x1024_v.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_friends_c2_1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/Fx{r}-4_1280x1024.png",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/AuroraDream_by_DP_Studios1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_grass_1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_hairdresser_1280x1024_h.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_friends_c2_1280x1024.jpg",
                "http://www.flexer.info/wp-content/uploads/2008/05/imgs/vladstudio_fifa_1280x1024.jpg"  
            ];
 
 
             [Bindable]
            private var _images:Array = new Array();                        
 
            private function init():void
            {
                for (var i:uint = 0; i < _paths.length; i++) {
                    // creating images
                    var image:Image = new Image();
                    image.source = _paths[i];
                    // adding image to images array
                    _images.push(image);
                }
                ir.images = _images;
            }
        ]]>
    </mx:Script>
</mx:Application>

I think you noticed that our component is located in com/flexer folder. That why we use

xmlns:flexer="com.flexer.*"

and

<flexer:ImageRail...

This is the component and from the two mini applications you can see how it can be used. There enough space to extend it and to use it in many applications.

What else can be added? Here are just some thoughts:

  1. a parameter to make it circular (when it gets to end it should display the first images after the last) - this is a complex job and there are a couple of ways doing it
  2. titles for images
  3. a parameter to use an XML to tell the URLs to images and the titles
  4. events on images

A very nice article about easing by James Ward is here and the demo is here.

Popularity: 93%

Share and Enjoy:
  • Technorati
  • StumbleUpon
  • del.icio.us
  • NewsVine
  • Reddit
  • Digg
  • Furl
  • co.mments
  • blogmarks
  • Slashdot
  • DZone
  • Taggly
  • YahooMyWeb
  • connotea
  • Webride
imageRailApp_sources
imageRailApp
ImageRailApp2




Tags: , , ,

This post was written by Andrei Ionescu

Views: 3116
Posted by 1010