Просмотр полной версии : Переход на Flex. Трудности со stage
Раньше работал во флеше, где имелся Document class, в котором был объект stage, к которому можно было делать addChild, addEventListener и т.д.
Сейчас решил пересесть на flex. Тут же столкнулся с проблемкой. Во flex используется MXML, таким образом stage доступен только в MXML а в главном классе его нет (stage === null) :(
Есть какой нибудь способ в MXML указать главный класс, чтобы внутри него использовать stage, а не uicomponent?
package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.*;
public class test2 extends Sprite
{
public function test2():void {
var spr: Sprite = new Sprite();
spr.graphics.beginFill(0xFF0000);
spr.graphics.beginFill(0x00FF00, 100);
spr.graphics.lineStyle(1, 0x000000, 100);
spr.graphics.moveTo(200, 200);
spr.graphics.lineTo(200, 300);
spr.graphics.lineTo(300, 300);
spr.graphics.lineTo(300, 200);
var mc: MovieClip = new MovieClip;
mc.addChild(spr);
stage.addChild(mc);
}
}
}
хм у вас какая-то флекс-каша.
вот где здесь логика? связанный ход мысли?
Во flex используется MXML, таким образом stage доступен только в MXML а в главном классе его нет (stage === null) :(
stage есть у всех визуальных компонент, и у application тоже. обычное поведение AS3'шных DisplayObject'ов. значение ненулевое, когда объект добавлен в display list. посмотрите на жизненный цикл флексовых компонент. вы, наверное, обращаетесь к stage слишком рано
Ммммм...
Тогда такой вопрос: как указать главный класс во flex?
К примеру в CS3 нужно было прописать имя главного класса в поле Document Class и тогда при запуске флешки создавался экземпляр прописанного класса.
Теперь я создаю FLEX проект.
Создаю в нем файл mainClass.as
package {
import flash.display.MovieClip;
import flash.display.Sprite;
public class test2 extends Sprite
{
public function test2():void {
var spr: Sprite = new Sprite();
spr.graphics.beginFill(0xFF0000);
spr.graphics.beginFill(0x00FF00, 100);
spr.graphics.lineStyle(1, 0x000000, 100);
spr.graphics.moveTo(200, 200);
spr.graphics.lineTo(200, 300);
spr.graphics.lineTo(300, 300);
spr.graphics.lineTo(300, 200);
var mc: MovieClip = new MovieClip;
mc.addChild(spr);
stage.addChild(mc);
}
}
}
В MXML файле пишу
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="initApp()">
<mx:Script>
<![CDATA[
public function initApp():void{
import mainClass;
var tmp = new mainClass();
}
]]>
</mx:Script>
</mx:Application>
Строчка stage.addChild(mc); естественно выдает ошибку
TypeError: Error #1009: Cannot access a property or method of a null object reference.
Т.к. stage === null
Дождитесь события ADDED_TO_STAGE.
2morrowMan
23.03.2009, 13:32
А что такой код у вас во Флеше работал ?
2morrowMan, да во Флеше работал. Рисовался квадрат на stage.
Добавлено через 9 минут
Переписал manClass.as:
package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.*;
public class mainClass extends Sprite {
public function mainClass():void {
trace('mainClass', stage);
addEventListener(Event.ADDED_TO_STAGE, init);
}
public function init():void {
trace('init');
var spr: Sprite = new Sprite();
spr.graphics.beginFill(0xFF0000);
spr.graphics.beginFill(0x00FF00, 100);
spr.graphics.lineStyle(1, 0x000000, 100);
spr.graphics.moveTo(200, 200);
spr.graphics.lineTo(200, 300);
spr.graphics.lineTo(300, 300);
spr.graphics.lineTo(300, 200);
var mc: MovieClip = new MovieClip;
mc.addChild(spr);
stage.addChild(mc);
}
}
}
Конструктор mainClass вызывается, а вот событие ADDED_TO_STAGE не происходит (функция init не вызывается), ну и строчка
trace('mainClass', stage);
выдает mainClass null
А строчка
trace('initApp', stage); в MXML файле в функции initApp
Выдает initApp [object Stage]
Т.е. в MXML stage существует, а в mainClass переменная stage == null
2morrowMan, да во Флеше работал. Рисовался квадрат на stage.
Потому что это был рутовый класс, он уже был на сцене.
А у вас событие не вызывается потому что mainClass не добавлен в display list.
__etc, да вы правы.
Все заработало.
Опишу что нужно было сделать, может кому поможет в будущем =)
Во-первых надо было сделать addChild:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="initApp()">
<mx:Script>
<![CDATA[
import mainClass;
public function initApp():void{
var tmp = new mainClass();
this.addChild(tmp);
}
]]>
</mx:Script>
</mx:Application>
Во-вторых класс должен быть наследником UIComponent, ну и действительно надо дождаться ADDED_TO_STAGE:
package
{
import mx.core.UIComponent;
import mx.events.FlexEvent;
import mx.core.Application;
import flash.events.Event;
import flash.display.Sprite;
import flash.display.MovieClip;
public class mainClass extends UIComponent {
public mainClass Component() {
this.addEventListener( Event.ADDED_TO_STAGE , init );
}
private function init( event:Event ) : void{
trace( this , "init called" , stage );
var spr: Sprite = new Sprite();
spr.graphics.beginFill(0xFF0000);
spr.graphics.beginFill(0x00FF00, 100);
spr.graphics.lineStyle(1, 0x000000, 100);
spr.graphics.moveTo(200, 200);
spr.graphics.lineTo(200, 300);
spr.graphics.lineTo(300, 300);
spr.graphics.lineTo(300, 200);
var mc: MovieClip = new MovieClip;
mc.addChild(spr);
stage.addChild(mc);
}
}
}
PS Спасибо всем откликнувшимся :)
public mainClass Component() {
this.addEventListener( Event.ADDED_TO_STAGE , init );
}
... Чё то странное.. )
Даже если убрать странности получается так ...
Severity and Description Path Resource Location Creation Time Id
1008: variable 'tmp' has no type declaration. tnt/src tnt.mxml line 15 1238341897735 120
1008: variable 'tmp' has no type declaration. tnt/src totry.mxml line 8 1238341899554 122
но квадрат рисуется.. наверно таки это не самый верный способ... х.з.
Dmitriy913
16.05.2011, 02:48
Тема старая, но всё равно напишу.
xdoom, "variable 'tmp' has no type declaration" - переменная 'tmp' не имеет определения типа.
надо в коде писать var tmp:<тип> = new mainClass();
Тип может быть mainClass либо UIComponent наверное =)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.